2

Node オブジェクトで構成される有向非巡回グラフがあります。各ノードにはstd::shared_ptr、グラフ内の子である他のノードへの のリストがあります。ノードの挿入/置換/再親化、ノードが別のノードの祖先であるかどうかのテストなど、必要な便利なメソッドがたくさんあります。標準の STL に似たメソッドもあれば、有向非巡回グラフに固有のものもあれば、私のノードに固有のものもあります。ニーズ。

問題は、そのようなメソッドがノードをパラメーターとして受け取る場合、参照を受け取る必要があるかどうかです。のweak_ptr?またはshared_ptr?ユースケースを調べてみましたが、わかりにくいです。ここで最高のデザインは何ですか?私はスマート ポインターを初めて使用するので、何が最適な選択なのかわかりません。shared_ptr<Node>ノードオブジェクトの「表現」として扱うべきですか? それとも、選択の仕方がより洗練されているのでしょうか。

前もって感謝します

4

1 に答える 1

2

所有者のセットが意味のある拡張されている場合にのみ、(値で)渡すshared_ptrかコピーします。ノードを純粋な情報として扱う場合は、ポインターを渡すことが安全であり、推奨されます。

任意のグラフ オブジェクトからstd::enable_shared_from_this正しい値を取得する機能に注意してください。std::shared_ptrその基本クラスでは、有効なネイキッド ポインターと共有ポインターは本質的に同等です。追加されるオーバーヘッドがどれだけあるかはわかりません。(これにより、追加のヒープの断片化が発生しないことが確実に保証されます。これstd::make_sharedも発生します。)

どこでも渡すshared_ptrことは、 によってエレガントに提供される機能の最適化にすぎませんshared_from_thisconstただし、所有権を積極的に調停せずに情報を提供しているだけなので、参照する場合は参照渡ししてください。

于 2013-01-08T03:26:27.637 に答える