說我有一個對象,其中包含一個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