6

私が理解しているように、 aunique_ptrは排他的所有権を意味します。個別にリンクされたリストはこれに適合するようで、各ノードが次のノードを所有しています (pseduocode アラート)

class node{
public:
      unique_ptr<node> next;
      int value;
};

しかし、私が慣れているリストをトラバースするような操作を実行する方法がわかりません

here=here->next;

を使用してデータ構造をどのように実装しますunique_ptrか? それらは仕事に適したツールですか?

4

1 に答える 1

8

ノードを通過するとき、ノード ポインターを所有する必要はありません。つまり、

ここ=ここ->次;

ここが unique_ptr の場合は正しくありません。オブジェクトを所有するということは、「その生と死に責任を持つ」ことを意味します。つまり、オブジェクトを破壊するコードを持っているのは所有者です。所有の別の定義を使用する場合、それは unique_ptr が意味するものではありません。

リスト ノード コードでは、各ノードが次のノードを担当すると想定します (ノードを破棄すると、次のノードもすべて破棄されます)。それは有効な動作である可能性があります。それはあなたのニーズに依存しますが、それがあなたが本当に望んでいるものであることを確認してください.

あなたが望むのは、ポインタを所有せずに読むことです。これを行うための現在の良い方法は、このコードを見ている他の開発者に「使用するが所有しない」種類の使用法を示す生のポインターを使用することです (unique_ptr は「私が死ぬと、ポイントされたオブジェクトも死ぬ」ことを意味します):

node* here = nullptr; // it will not own the pointed nodes (don't call delete with this pointer)
here = &first_node(); // assuming first_node() returns a reference to the first node
here = here->next.get(); // to get the next node without owning it: use get() - true in all smart pointers interface
于 2012-12-04T19:35:03.890 に答える