4

現時点では、演習としてリンクされたリストで遊んでいます。

Cracking The Coding Interview本で私が見ている例には、LinkedList (マネージャー) クラスがなく、Node だけがあり、メイン関数のヘッド Node にしがみついています。

私は C++ の実装を調べましたが、ほとんどは C++ よりも C スタイル、つまりオブジェクト指向ではないようです。それらは構造体を使用し、クラスは使用せず、リストを削除するための静的メソッドを持っています。これを呼び出すことを明示的に覚えておく必要があります。メモリの割り当て解除を処理する適切なデストラクタを備えた適切な RAII (Resource Acquisition Is Initialization) スタイルの C++ クラスを作成し、Node クラスのみ (LinkedList クラスは使用しない) を使用したいと考えていました。

私がこれを機能させる唯一の方法は、Node のデストラクタが次の Node があればそれを削除することでした。リンクされたリスト。

私の質問を要約すると:

  • C++ でリンク リストを処理するオブジェクト指向クラスを作成する場合、デストラクタでリスト ノードの削除を処理する LinkedList (マネージャ) クラスが必要ですか?
  • そうでない場合、ノードの破壊にどのように対処しますか?

ありがとう!

4

1 に答える 1

6

リンクされたリストを処理するオブジェクト指向クラスを C++ で作成する場合、デストラクタでリスト ノードの削除を処理する LinkedList (マネージャ) クラスが必要ですか?

いいえ、構造はノード間のリンクによって定義されるため、個別のマネージャー オブジェクトは必要ありません。特にSTLのようなライブラリを設計していて、すべてのコンテナに同様のインターフェースを持たせたい場合は、1つあると便利な場合がありますが、ノードタイプだけでリンクリストを実装することもできます.

そうでない場合、ノードの破壊にどのように対処しますか?

再帰を回避する 1 つの方法は、次のように、削除する前にリストから各ノードを削除することです。

~node() {
    while (node * victim = next) {
        next = victim->next;
        victim->next = nullptr;
        delete victim;
    }
}
于 2012-08-03T11:54:03.573 に答える