说我有一个对象,其中包含一个shared_ptr到一个子对象。如何构建一个使用weak_ptr存储对父级的引用的对象?
我想子对象有一个weak_ptr到父对象,子对象的构造函数应该是什么样的,我应该如何从父类构造一个子对象?
在此先感谢
说我有一个对象,其中包含一个shared_ptr到一个子对象。如何构建一个使用weak_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
的唯一优势(它仍然无法对其父母进行任何操作,但至少它可以安全地说明这一点),但这依赖于其父母拥有一个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()));
}
};
这样做,谢谢 – BvdBijl 2012-02-11 14:08:17
什么其他对象,那么“子”与“父”股权? “孩子”是否有多个父母? – 2012-02-11 13:35:35
孩子有一个父母总是,孩子不分享 – BvdBijl 2012-02-11 13:39:11
在这种情况下,孩子可以持有一个原始指针,其父母,因为孩子保证不会超过其父母。你有没有访问'unique_ptr'? – 2012-02-11 13:41:09