2017-10-18 9 views
3

各ノードに子ノードへのポインタが含まれているバイナリツリーがある場合は、unique_ptrがうまく機能します。各ノードに親ポインタを持たせたい場合、ノードに3つのポインターがあるため、状況はあまり良くありません。Binary Tree with parent pointerバイナリツリーのスマートポインタ

この場合、私は何ができますか?私はすべてのためにshared_ptrを使用することができますが、私はサイクルを得るかもしれないので、それは良いデザインではないと言われてきました。親ポインタにweak_ptrを使用する場合は、shared_ptrweak_ptrから作成しますか?

普通の組み込みポインタがこの問題に適していると思っています。アドバイスをいただければ幸いです。

+11

'std :: unique_ptr'と親に対する**所有していない**未処理のポインタのペアには何も問題はありません。 – StoryTeller

+7

ほとんどの場合、スマートポインタには単純な自己削除ポインタが表示されるのではなく、所有権プリミティブとして表示されるべきです。"リソース"は単一の所有者( 'std :: unique_ptr')または複数の同時所有者(' std :: shared_ptr'を持つ)のみを持つことができますか? –

+0

多分私はここにいますが、btreeの実装の中でスマートポインタを使用するという考えは、最良のものではありません。あなたがコントロールしている具体的なクラスの中で生ポインタを使うことには何の問題もありません。また、「所有者である」という概念は、ツリーに結びついた簡単な(直感的な)ビューが複数あります。後でグラフ操作を実装したい場合は、おそらく混乱するでしょう。 –

答えて

4

私は、各ノードがちょうど非常にうまく機能unique_ptrその後、 子ノードへのポインタ含まれているバイナリツリーを持っている場合。

右。

私は、各ノードが親ポインタを持つようにしたい場合は、状況は ノードがそれに

を指している3つのポインタを有することができるので、あなたはを所有している間のポインタを区別する必要があり、とても素敵ではありませんポインタとを参照してポインタ。

ポインタを所有持つことは悪いアイデアやバグとリークのソースです。一方で、の生のの観察のポインターは、多くの場合(観察されたオブジェクトがまだ「生きている」限り)うまくいくことがあります。あなたのケースでは

、あなたはこれらのポインタを所有し、この場合もunique_ptr作品のようなスマート所有ポインタを使用しているとして、各ノードは、子ノードにunique_ptr Sを含有する設計を検討する必要があります。

一方、子ノードは非所有ポインタを使用して、その親を参照することができます(子供が自分の親、子どもたちはちょうど親を観察するノード「所有していません」)、 未加工ポインタは、非所有のと表示され、ポインタとして正常に動作します。あなたが使用している場合shared_ptrあなたが適切にブレークそれらをしませんかのように、サイクルに注意を払わなければならない/サイドノートとして、

は、あなたがリーク(未発表のオブジェクト)を持っています。一方、親はunique_ptrを所有して子どもを指しており、子供は生の観察ポインタを介しての親を観察しているので、私にとってはよりシンプルなデザインのようです。

+0

ありがとうございます。私は組み込みのポインタは常に悪いと思った(関数ポインタを除いて)。しかし、それはポインタを所有し、観察することを考えるのがはるかに理にかなっています。観察には、弱いポインタと組み込みのポインタを使用する必要があります。ユニークで共有されたポインタ。ありがとう、これは私にははるかに明確です。 – RonnyZed

+0

@RonnyZedよろしくお願いします。私はいくつかの助けになってうれしいです。 –