Извиняюсь, если об этом уже спрашивали, я не совсем уверен в терминологии или в том, как задать вопрос.
Мне интересно, есть ли библиотеки или лучшие практики для реализации объектных моделей в C ++. Если у меня есть набор классов, где экземпляры этих классов могут иметь отношения друг к другу и могут быть доступны друг другу с помощью различных методов, я хочу выбрать хороший набор базовых структур данных для управления этими экземплярами и их взаимосвязями. Это легко в Java, так как он обрабатывает выделение памяти и сборку мусора для меня, но в C ++ я должен сделать это сам.
HTML объектная модель документа (DOM) - один из примеров; в качестве другого (надуманного) примера, предположим, у меня есть эти классы:
Entity
Person
(подкласс Entity
)
Couple
(подкласс Entity
)
Property
House
(подкласс Property
)
Pet
(подкласс Property
)
Car
(подкласс Property
)
и эти отношения:
Entity
- имеет 1
home
класса House
- имеет 0 или более
pets
класса Pet
- имеет 0 или более
cars
класса Car
- имеет 0 или более
children
класса Person
Person
- имеет 0 или 1
spouse
класса Person
- имеет 0 или 1
marriage
класса Couple
- имеет 0 или 1
parents
класса Entity
(в этой модели родители не существуют, если они не живы!)
Couple
- имеет 2
members
класса Person
Property
- имеет 1
owner
класса Entity
Теперь, когда я продумал эти объекты и их отношения, я хочу начать создавать структуры данных, а также методы и поля для их обработки, и вот где я теряюсь, поскольку мне приходится иметь дело с распределением памяти и управлением временем жизни и все эти вещи. Вы можете столкнуться с такими проблемами, как: Я мог бы захотеть поместить объект в std::map
или std::vector
, но если я это сделаю, я не смогу хранить указатели на эти объекты, так как они могут быть перемещены, когда карта или вектор растет или уменьшается.
Один из подходов, который я использовал, когда много работал с COM, - это иметь скрытую коллекцию, которая содержала бы все. Каждый объект в коллекции имел уникальный идентификатор (число или имя), по которому его можно было искать в коллекции, а каждый объект имел указатель на коллекцию. Таким образом, если у вас есть объект, который хочет указать на другой объект, вместо того, чтобы буквально удерживать указатель на другой объект, я сохраняю идентификатор и могу искать его через скрытую коллекцию. Я могу использовать подсчет ссылок, чтобы автоматически справляться с проблемами времени жизни (за исключением случая непересекающихся циклов, иногда это не проблема).
Есть ли другие подходы? Или есть библиотеки, облегчающие подобные вещи в C ++?
edit: тогда у вас возникнут другие проблемы, например, во многих случаях отношения между объектами могут быть изменяемыми, и вам нужно заранее подумать о том, как хранить ссылки на объекты и какие методы должны быть предусмотрены для доступа к объектам друг от друга. Например, если у меня есть дескриптор Person
X, и я хочу представить концепцию «найти ребенка Х по имени Джордж», то я должен сохранить имя «Джордж», а не номер ребенка: дети могут хранится в векторе, и я могу вызывать X.getChildCount () и X.getChild (0), но «Джордж» не всегда может быть дочерним номером 0, поскольку другие дочерние элементы могут быть вставлены перед «Джорджем» в детский вектор. Или у Х может быть двое, трое или четверо других детей, которых также зовут Джордж. Или «Джордж» может изменить свое имя на «Энтони» или «Джорджина». Во всех этих случаях, вероятно, лучше использовать какой-то уникальный неизменяемый идентификатор.
edit 2: (и я немного проясню свой вопрос, как только уладю это) Я могу иметь дело с выбором методов и имен свойств, я могу решить, использовать ли карта или список или вектор. Это довольно просто. Вот проблемы, с которыми я пытаюсь разобраться:
- как заставить один объект хранить ссылку на другой объект, когда эти объекты могут быть частью структур данных, которые перераспределяются
- как обращаться с управлением временем жизни объекта, когда существуют взаимные отношения между объектами