Поскольку у вас есть уникальный владелец дочерних объектов, ребенок гарантированно не переживет своего родителя.У вас может быть такая модель.
struct Parent;
struct Child {
Child( Parent& p ) : p_(&p) {}
Parent* p_;
};
#include <memory>
struct Parent {
std::unique_ptr<Child> c_;
void AddChild() {
c_.reset(new Child(*this));
}
};
Конечно, ребенок должен быть осторожен со всем, что он делает с родителем в деструкторе, он может быть уничтожен, потому что его родитель выходит изобъем.Это примерно единственное преимущество ребенка, имеющего weak_ptr
для своего родителя (он все равно не сможет ничего сделать с родителем от своего деструктора, но, по крайней мере, он может с уверенностью сказать это), но это зависит от его родителя.принадлежит shared_ptr
, что является гораздо более негибким дизайном для ребенка.
Это будет решение weak_ptr
:
// NOT RECOMMENDED
#include <memory>
struct Parent;
struct Child {
Child( const std::shared_ptr<Parent>& p ) : p_(p) {}
std::weak_ptr<Parent> p_;
};
struct Parent : std::enable_shared_from_this<Parent> {
std::unique_ptr<Child> c_;
void AddChild() {
// Warning, undefined behaviour if this Parent
// isn't owner by shared_ptr
c_.reset(new Child(shared_from_this()));
}
};