Как мне создать объект, который содержит ссылку на родителя, используя слабый_птр? - PullRequest
0 голосов
/ 11 февраля 2012

Скажем, у меня есть объект, который содержит shared_ptr для дочернего объекта.

Я хочу, чтобы у дочернего объекта было weak_ptr для родительского объекта, как должен выглядеть конструктор дочернего объекта и как я должен конструироватьребенок от родителя?

Заранее спасибо

1 Ответ

4 голосов
/ 11 февраля 2012

Поскольку у вас есть уникальный владелец дочерних объектов, ребенок гарантированно не переживет своего родителя.У вас может быть такая модель.

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()));
        }
};
...