子オブジェクトへの shared_ptr を含むオブジェクトがあるとします。
子オブジェクトに親オブジェクトへの weak_ptr を持たせたいのですが、子オブジェクトのコンストラクターはどのように見え、親から子をどのように構築すればよいですか?
前もって感謝します
子オブジェクトへの shared_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()));
}
};