Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.0.25] |
|
Сообщ.
#1
,
|
|
|
Много говорится о том что умные указатели следует применять вообще везде, где бы вы применили обычный указатель.
Вопрос : объект в конструкторе создаёт несколько дочерних объектов с помощью make_shared, тут понятно. Но в дочернем объекте хорошо бы хранить указатель на parent-объект. С обычным указателем понятно - в конструктор дочернего объекта передаём this и там его сохраняем. А вот как сохранить связь дочернего с родителем без использования обычных указателей? |
Сообщ.
#2
,
|
|
|
std::weak_ptr, если всё дерево через std::make_shared создаётся.
|
Сообщ.
#3
,
|
|
|
Задумывалось что дочерние объекты создаются в конструкторе родительского объекта. Не совсем понятно как в этот момент получить weak_ptr на себя.
Можно ли сделать так : наследовать родительский объект от enable_shared_from_this и создавать экземпляров родительского объекта через статическую функцию типа class ChildObj { ChildObj(weak_ptr<ParentObj> parent) { ..... } } class ParentObj : public enable_shared_from_this<ParentObj> { shared_ptr<ParentObj> create() { auto pointer = shared_from_this(); child.push_back(make_shared<ChildObj> (pointer)); return pointer; } } |
Сообщ.
#4
,
|
|
|
В конструкторе вызвать shared_from_this в любом случае не получится, т.к. конструктор вызывается до создания shared_ptr<ParentObj>.
В данной задаче вообще непонятно, зачем использовать shared_ptr. Это нужно, если ты хочешь хранить где-то ссылки на ChildObj вне зависимости от ParentObj - тогда нужно использовать shared_ptr<ChildObj> и weak_ptr<ParentObj>, но отказаться от создания ChildObj в конструкторе, либо инициализировать указатель на Parent позже. В ином случае лучше использовать unique_ptr<ChildObj> в родителе и ссылку на ParentObj в ChildObj. |