Семантика владения родительским / дочерним классом - PullRequest
1 голос
/ 25 декабря 2010

Я строил систему с родительским объектом, где он создает различные дочерние объекты, и каждому дочернему объекту для работы необходим главный объект.Итак, до сих пор я создавал shared_ptr<Parent> и Child*, поэтому, когда создатель Родителя и всех Детей исчезает, Родитель тоже уходит.

Но я перепроектирую свой API, чтобы Child мог быть создан в стеке (раньше это была просто куча).Теперь я не уверен, что делать с родителями, так как я не понимаю, почему они не должны быть также доступны для создания в стеке - с точки зрения их действительной функции - но что происходит, если родительский объект уничтожен, а затем кто-то пытается использоватьДитя, которое они перемещали, копировали или распределяли по куче?Должен ли я просто выбросить исключение?Пропустить выполнение операции?Или просто придерживаться распределения родителей в куче?

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Вот предложение проблемы

если родитель уничтожен, а потом кто-то пытается использовать ребенка ...

Если это возможно, то у вас общее владение, что подразумевает создание в куче.

Итак, либо вы придерживаетесь распределения кучи, либо отбрасываете семантику совместного владения. Другого пути нет. weak_ptr просто отсутствует в 1010 * рекламе состоянии общего объекта.

0 голосов
/ 24 февраля 2012

Если вы действительно хотите делать то, что рекламируете:

, если родитель уничтожен, а затем кто-то пытается использовать ребенка ...

Этобудет вызывать проблему, как упомянул @spraff.

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

...