私は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のみのソリューションに満足しています。
これは、 'enable_shared_from_this'がすでに行っていることです。あなたは宣言に迷子*があるので、shared_ptrへのポインタではなく、shared_ptrが必要です。 :) –
これは良い答えですが、私の状況では私は「扶養者」の議論を持っていません。この関数は、新たに作成されたノード(すなわち、 'np')を各依存関係の従属リストに追加するすべての依存関係をループします。 – Omnifarious
@Omnifarious:例を更新しました。 –