0

基本的な単一リンク リスト クラスを C++ で作成しようとしています。何年も前にデータ構造のクラスでやったのですが、詳細を思い出せません。

Node クラスにはコピー コンストラクターが必要ですか? メンバー変数として Node* があり、私の知る限り、動的メンバーを持つクラスのコピー コンストラクター、デストラクター、および代入演算子を常に記述する必要があります。しかし、ネットで見た限りでは、List クラスがノードのコピーを処理します。これは本当にそうなのですか? もしそうなら、なぜですか?

4

3 に答える 3

3

基本的な単一リンク リスト クラスについては、次のことをお勧めします。

  • 各ノードを割り当てた後は、割り当てた後にノードを移動またはコピーしないでください。
  • そのため、Node クラスのコピー コンストラクターと代入演算子を無効にします。

C++ は、定義しない場合、既定のコピー コンストラクターと代入演算子を生成します。これらのデフォルトを非公開として宣言し、実装しないことで、これらのデフォルトを無効にすることをお勧めします。


しかし、ネットで見た限りでは、List クラスがノードのコピーを処理します。これは本当にそうなのですか? もしそうなら、なぜですか?

リスト全体のコピー (コピーの作成) (つまり、リスト内のすべてのノードのコピーの作成) をサポートしているため、ノードのコピーを処理します。

リスト全体のコピーをサポートしない限り、ノードのコピーをサポートする必要はありません。

于 2009-10-01T01:54:43.403 に答える
1

sgi の slistの設計をコピーするよりも悪いことをする可能性があります-- sgi のテンプレート ライブラリ ("stl") は、C++ 標準ライブラリの一部の基礎であり、まだ (技術的に正しくありません;-) "stl" と呼ばれています。残念ながらslist、それはできませんでした (その二重結合のいとこlistOTOH はそれを作成し、 になりましたstd::list) が、私はそれが好きです.

ペイロード タイプとアロケータをテンプレート化したくない場合は、それらをハードコードしても問題ないと思います。ただし、保持する重要なポイントは、「ノード」は内部実装の詳細であるということです。コンテナーの型のみを公開し、すべての優れた標準的な側面を備えています (もちろん、ペイロードの型を知っている必要があります。テンプレート化するの難しくありません)。 、ところで;-)、そしてあなたはあなたの.hで「ノード」を不透明なクラスにします(あなたの.hにはclass node;、それへのポインタとそれへのポインタだけが含まれていますclass slist)。

于 2009-10-01T02:12:35.440 に答える
0

単独でリンクされたリストがある場合:

A1 -> B1 -> C1

独自のコピー コンストラクターを作成し、内部 Node* メンバーでコピー コンストラクターを呼び出すと、次のようになります。

A1 -> B1 -> C1
A2 -> B2 -> C2

すべきでないことは、カスケード コピーを実行しない暗黙的に生成されたコピー コンストラクターを呼び出すことです。得られるものは次のとおりです。

      A2
      |
      v
A1 -> B1 -> C1

したがって、独自のコピー コンストラクターを記述してディープ コピーを実行するか、ノーオペレーションを実装するプライベート コピー コンストラクターを定義します。

ところで、std::list は二重リンク リストを実装し、ディープ コピー セマンティクスを実装します。

于 2009-10-01T02:11:21.590 に答える