C ++ Привязка индекса к одной структуре данных - PullRequest
3 голосов
/ 25 июня 2011

Предположим, у меня есть два контейнера элементов:

std::vector<std::string> foo = { "aa", "bb", "cc" };
std::vector<std::string> bar = { "dd", "ee" };

Я передаю неопределенности в foo и bar между многими классами, которые работают с этими двумя контейнерами. Тем не менее, я обнаружил, что должен быть очень осторожным, чтобы не перепутать, какие индексы связаны с каким контейнером, и иногда терпеть неудачу в этом, а затем иметь много проблем с поиском логических ошибок, которые приводят.

Итак, предположим, у меня есть два значения:

int id_foo = 1;
int id_bar = 0;

Существует ли простой шаблон проектирования, который помогает предотвратить случаи, когда я пытаюсь вызвать bar[id_foo] путем "привязки" id_foo к foo.

По сути, я пытаюсь найти самый простой способ устранения неоднозначности между foo и bar. Я мог бы создать отдельные классы для каждого, а затем просто определить итераторы для этих классов. Но я хотел бы избежать создания отдельного класса для каждого контейнера, такого как foo и bar, для которого я хочу эту «безопасность».

Вопрос задает что-то вроде «индекс безопасности» (аналог безопасности типа). В настоящее время я выполняю это, называя мои индексы таким образом, чтобы указать, с каким контейнером они связаны.

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

На самом деле не существует шаблона проектирования для дифференциации индекса.Существуют некоторые соглашения.

Вы можете использовать typedef для их дифференциации.То есть введите int, чтобы быть FooIndex, и аналогично для BarIndex.Вы могли бы также использовать немного венгерской нотации для имен (я знаю, что люди ненавидят это, но это действительно то, для чего они предназначены).Вы, кажется, уже используете некоторые из них, но не в полезной форме.Обратите внимание на следующее соглашение об именах:

int fooCurrentKey = 1;
int barCurrentKey = 0;

. Это позволяет узнать, что первый индекс предназначен для списка foo, а второй - для списка bar.

.
0 голосов
/ 25 июня 2011

Нет необходимости устанавливать разные классы, просто используйте итераторы вместо индексов.Он перейдет к соответствующему элементу, так как он уже знает, в какой контейнер заглядывать (при необходимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...