假设我有一个包含子对象的 shared_ptr 的对象。
我希望子对象对父对象有一个weak_ptr,子对象的构造函数应该是什么样的,我应该如何从父对象构造一个子对象?
提前致谢
假设我有一个包含子对象的 shared_ptr 的对象。
我希望子对象对父对象有一个weak_ptr,子对象的构造函数应该是什么样的,我应该如何从父对象构造一个子对象?
提前致谢
由于您拥有子对象的唯一所有权,因此可以保证子对象的寿命不会超过其父对象。你可以有一个像这样的模型。
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
对父母拥有 a 的唯一优势(它仍然无法通过其析构函数对父母做任何事情,但至少它可以安全地告诉这一点)但这依赖于其父母由 a 拥有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()));
}
};