あなたがノードを通過するとき、あなたは次の>ここ= here-その
を意味し、ノードポインタを所有する必要はありません。
ここに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
私はノードに次の責任を負うことを約束していません。私は生のポインタとスマートポインタの間の変換方法を理解しようとしており、これは最も直接的なようでした。代替案に関する提案はありますか? –
さて、私はshared_ptrを使うのはもっと高価だが扱いが簡単だろうと思う。ノードを切り離すのは非常に簡単です。つまり、最適化されたリストの実装では、ローポインタとカスタムノードの割り当てが行われます。 – Klaim
'std :: swap'について忘れないでください。 –