我正在創建一個將成爲DAG一部分的類。構造函數將指向其他實例並使用它們初始化依賴項列表。
在依賴列表被初始化之後,它只能被縮短 - 實例永遠不能被添加爲它自己或它的任何子項的依賴。如何在構造函數中將weak_ptrs分發給此對象?
::std::shared_ptr
是一個很自然的處理這個。爲處理DAG做了參考計數。
不幸的是,依賴關係需要知道它們的依賴關係 - 當一個依賴關係被更新時,它需要告訴它的所有依賴關係。
這會產生一個微不足道的循環,可以用::std::weak_ptr
來打破。依賴關係可能會忘記消失的依賴關係。
但我找不到一個方法讓依賴者在構建時自己創建一個::std::weak_ptr
。
這不起作用:
object::object(shared_ptr<object> dependency)
{
weak_ptr<object> me = shared_from_this();
dependency->add_dependent(me);
dependencies_.push_back(dependency);
}
在析構函數的代碼會導致構造函數退出之前被調用。
有沒有很好的方法來處理這個問題?我非常滿意C++ 11-only解決方案。
這就是'enable_shared_from_this'已經做了什麼。你的聲明中還有一個雜散的* - 你想要一個shared_ptr,而不是指向shared_ptr的指針。 :) –
這是一個很好的答案,但在我的情況下,我不會有'家屬'的論點。該函數將循環遍歷所有依賴項,將新創建的節點(即'np')添加到每個依賴項的依賴項列表中。 – Omnifarious
@Omnifarious:更新了示例。 –