2011-02-09 5 views
0

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

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

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

Edit:

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

+2

«мы можем по крайней мере гарантировать, что объекты не удаляются случайно или из-за глупости» Никогда не недооценивайте силу глупости. –

ответ

1

Это хорошая оценка?

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

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

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

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

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

0

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

0

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

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

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

+0

По моему опыту, мои коллеги и студенты часто имеют базовые знания о C++, но ограниченные знания о разработке программного обеспечения или базовой механике. Это означает, что они знают об «удалении», но не имеют понятия о «свободе». – DaClown

1

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

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

Смежные вопросы