2012-02-11 68 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

相關問題