如何使用weak_ptr构造一个包含对父级的引用的对象?

Bvd*_*ijl 3 c++ constructor weak-ptr

假设我有一个包含 shared_ptr 到子对象的对象。

我希望子对象对父对象有一个weak_ptr,子对象的构造函数应该是什么样子,我应该如何从父对象构造子对象?

提前致谢

CB *_*ley 5

由于您拥有子对象的唯一所有权,因此可以保证子对象的寿命不会超过其父对象。你可以有一个这样的模型。

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));
        }
};
Run Code Online (Sandbox Code Playgroud)

当然,子进程在析构函数中对父进程所做的任何事情都应该小心,它可能会因为父进程超出范围而被销毁。这是一个孩子拥有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()));
        }
};
Run Code Online (Sandbox Code Playgroud)