2012-02-11 27 views
0

说我有一个对象,其中包含一个shared_ptr到一个子对象。如何构建一个使用weak_ptr存储对父级的引用的对象?

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

在此先感谢

+0

什么其他对象,那么“子”与“父”股权? “孩子”是否有多个父母? – 2012-02-11 13:35:35

+0

孩子有一个父母总是,孩子不分享 – BvdBijl 2012-02-11 13:39:11

+2

在这种情况下,孩子可以持有一个原始指针,其父母,因为孩子保证不会超过其父母。你有没有访问'unique_ptr'? – 2012-02-11 13:41:09

回答

4

当你有孩子的唯一所有权对象的孩子保证不会活得比它的父。你可以有一个这样的模型。

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

这样做,谢谢 – BvdBijl 2012-02-11 14:08:17

相关问题