Хорошая практика для ссылок на объекты - PullRequest
0 голосов
/ 09 февраля 2011

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

Это хорошая практика? Есть ли другие, лучшие способы сделать это?

Фон: проект рассчитан на академическое образование. Мы точно не знаем, что студенты или другие люди способствуют этому. Также уровень квалификации не известен, но, вероятно, не очень высокий. Не используя указатели, мы можем по крайней мере гарантировать, что объекты не будут удалены случайно или из-за глупости.

Edit:

Что привело меня к идее уникального идентификатора, так это использование векторов для хранения данных. Контейнеры STL очень часто копируют содержимое. Вот почему я не уверен, что указатели будут работать хорошо. То же самое с простыми индексами векторных элементов, содержимое и / или порядок могут измениться.

Ответы [ 4 ]

1 голос
/ 09 февраля 2011

Модификации вектора могут сделать недействительными любые указатели на объекты в векторе. Вам следует избегать создания долгоживущих указателей на содержимое вектора.

Возможно, лучше хранить умные указатели в векторе.

1 голос
/ 09 февраля 2011

Это хорошая практика?

По моему опыту, нет.Любой вид дерьма с уникальным идентификатором - это еще одна вещь, которой нужно управлять, и которой нужно управлять правильно, иначе вы получите всякое странное хреновое распыление.Однажды я работал над продуктом, который использовал эту идею, и значительная часть наших ошибок, и даже больше проблем с обслуживанием, были вызваны необходимостью помнить о глупой переменной отслеживания ID.Конечно, реализация была довольно запутанной (на грани безумия), и ее очень легко сделать лучше, чем делали, но это еще одна вещь, с которой нужно иметь дело, когда у вас уже есть уникальный идентификатор, сгенерированный системой: адрес переменной.

Есть ли другие, лучшие способы сделать это?

Да, используйте указатели.

К сожалению, не существует такого понятия, как умный указатель (который я знаю в любом случае), который можно было бы использовать для простой ссылки на объекты, принадлежащие в другом месте, так что покаВы должны убедиться в том, что проблема будет решена с помощью политики и документации.Да, это слабость, но все же гораздо лучшая альтернатива отслеживанию и идентификатору, которая может легко вызывать те же проблемы и даже больше.

Если вам интересны умные указатели, которые можно использовать для таких целейВас может заинтересовать моя последняя запись в блоге.

0 голосов
/ 09 февраля 2011

Вы действительно можете использовать указатели.

Чтобы не допустить удаления экземпляра, сделайте деструктор закрытым.Таким образом, случай не может быть разрушен.

Однако, как указал Джеймс МакНеллис, никогда не стоит недооценивать силу глупости.Вы не можете запретить кому-либо звонить бесплатно (ptr) или перезаписывать память в вашем экземпляре.

0 голосов
/ 09 февраля 2011

Просто используйте указатель - вот для чего они.Вы должны использовать что-то вроде уникальных идентификаторов, только если по какой-то причине вам нужно сериализовать ссылки на них.Если вы пишете только код, который не нуждается в отправке ссылок между процессами, используйте указатель.Особенно, если нет кучи объектов, и вам не нужно учитывать право собственности.

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