問題タブ [copy-constructor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
2226 参照

c++ - コピーコンストラクターと動的割り当て

次のクラスのコピーコンストラクター(およびoperator =)の書き方をお聞きしたいと思います。

クラスノードは、各ノードの座標x、yと別のノードへのポインタを格納します。

クラスNodesList(std :: vectorから継承)は、動的に割り当てられたすべてのノードを格納します

メインプログラム:

}

各ノードの浅いコピーではなく、各ノードの深いコピーを作成したいと思います。コピーコンストラクターを使用したサンプルコードをお願いできますか?

各ノードは複数回指定できます。3つのノードn[1]、n [2]、n[3]がNodesListnl1に格納されている場合、このような状況を考えてみましょう。

n[1]はn[2]を指します

n[2]はn[3]を指します

n[3]はn[2]を指します

A]コピーコンストラクターはノードn[1]を処理します。古いオブジェクトn[1]_oldのコピーで表される新しいオブジェクトn[1]_newを作成します。n [1]_oldからポイントされたノードn[2]はまだ存在しないため、n[2]_newも作成する必要があります...n1_newからn2_newへのポインタが設定されます。

B]次に、2番目の点n[2]が処理されます。2回作成することはできません。n[2]_newはA]で作成されました。ただし、指定されたノードn [3]は存在しないため、古いオブジェクトn[3]_oldのコピーとして新しいオブジェクトn[3]_newが作成されます。n2_newからn3_newへのポインタが設定されます。

C]ノードn[3]_newはすでに作成されており、n[2]_newです。n3_newからn2_newへのポインタが設定され、他のオブジェクトは作成されません。

したがって、コピーコンストラクタは、オブジェクトが過去に作成されたかどうかを確認する必要があります...

いくつかの参照カウントが役立つ可能性があります...

0 投票する
1 に答える
136 参照

c++ - C++のデフォルトコンストラクタなしの配列に関する1つの質問

以前の投稿から、少なくとも、デフォルトのコンストラクターなしで配列を宣言する方法は2つあることを学びました。このような

また、最初のコンストラクターはパラメーターを直接使用してオブジェクトを構築し、2番目のコピーコンストラクターがここで使用されることも学びました。ただし、以下のコードをテストすると。コピーコンストラクターをプライベートにします。コピーコンストラクターの使用法の違いがわかると思います。しかし、それは私が期待したものではありません。2つの宣言はどちらも機能していません。

なぜこれが起こるのか誰かが私に説明できますか?

0 投票する
3 に答える
409 参照

c++ - これは有効な Copy Ctor ですか?

以下のコピーコンストラクタ関数に何か問題があるのだろうか?

0 投票する
4 に答える
2594 参照

language-agnostic - 不変オブジェクトにコピーコンストラクタが不要なのはなぜですか?

不変オブジェクトにコピーコンストラクタが不要なのはなぜですか?これを説明してください。

0 投票する
6 に答える
179914 参照

java - Clone()とコピーコンストラクタ-これはJavaで推奨されています

クローンメソッドとJavaのコピーコンストラクタ。どちらが正しい解決策です。それぞれのケースをどこで使用しますか?

0 投票する
3 に答える
3871 参照

c++ - C++ コピー構築構築と代入に関する質問

以下は、書籍「C++ Gotchas」の項目 56 からの抜粋です。

Y オブジェクトの単純な初期化が、3 つの異なる方法のいずれかであるかのように記述されることは珍しくありません。

実際のところ、これら 3 つの初期化はすべて同じオブジェクト コードが生成される可能性がありますが、同等ではありません。a の初期化は直接初期化として知られており、期待通りの動作をします。初期化は、Y::Y(int) の直接呼び出しによって実行されます。

b と c の初期化はより複雑です。実際、それらは複雑すぎます。これらは両方ともコピーの初期化です。b の初期化の場合、値 1066 で初期化された、タイプ Y の匿名一時の作成を要求しています。次に、この匿名一時を、クラス Y のコピー コンストラクターへのパラメーターとして使用して、b を初期化します。最後に、匿名のテンポラリのデストラクタを呼び出します。

これをテストするために、データ メンバ (最後に添付されたプログラム) を使用して単純なクラスを作成したところ、驚くべき結果が得られました。c の場合、本で示唆されているのではなく、コピー コンストラクターによってオブジェクトが構築されたようです。

言語標準が変更されたのか、それとも単にコンパイラの最適化機能なのか、誰か知っていますか? Visual Studio 2008 を使用していました。

コードサンプル:

出力:

私が最も驚いたのは、d と e を構築した結果です。正確には、空のオブジェクトが作成され、次にオブジェクトが作成されて空のオブジェクトに割り当てられることを期待していました。実際には、オブジェクトはコピー コンストラクターによって作成されました。

0 投票する
4 に答える
343 参照

c++ - アドレスでコンストラクターをコピーする

私は2つのコピーコンストラクターを持っています

2番目のコピーコンストラクターはいつ呼び出されますか?

0 投票する
3 に答える
1670 参照

c++ - STLベクターへのオブジェクトの保存-最小限のメソッドセット

STLコンテナに保存したい複雑なオブジェクト(明示的にマロックされた内部データを含む)の「最小限のフレームワーク」(必要なメソッド)とは何<vector>ですか?

私の仮定(複雑なオブジェクトDoitの例)の場合:

与える

とvalgrindで:

アップデート:

このようなオブジェクトの最小メソッドは次のとおりです:(sbi回答に基づく)

ありがとう、sbi、https: //stackoverflow.com/users/140719/sbi

0 投票する
3 に答える
1050 参照

c++ - std :: string x(x);

これは私のコンパイラで非常にひどくクラッシュします。this != &thatこれは、自分のコピーコンストラクターでテストする必要があることを意味しますか、それとも、これほど愚かなクライアントはいないと想定できますか?

0 投票する
2 に答える
481 参照

c++ - 抽象メンバーフィールドへのptrを持つファクトリクラスのcctorとop =を記述する方法は?

zip および rar アーカイブから raw バッファーにファイルを抽出しています。minizip と unrarlib をラップするために以下を作成しました。

Archive.hpp - すべてにアクセスするために使用されます。他のクラスのすべての関数を外部からアクセスできないようにすることができれば、そうします。(実際には、Archive 内の他のすべてのクラスと友達になり、プライベート関数のコールバックを使用できると思いますが、それは遠回りです。)

ArchiveBase.hpp

ArchiveDerived.hpp「派生」は「Zip」または「Rar」

ArchiveDerived.cpp

誰かが私ができるようにこのデザインを使用することを提案しました:

  • アーカイブの cctor を作成するにはどうすればよいですか?

  • アーカイブの op= はどうですか?

  • ArchiveBase::Dataへの「名前変更」について何ができArchive::Dataますか? (minizip と unrarlib の両方が入力と出力にこのような構造体を使用します。データは Zip と Rar では一般的であり、後でそれぞれのライブラリの構造体を作成するために使用されます。) 他のすべては 経由でアクセスされ、外部クラスでArchive宣言したいと思います。Dataこの道も。

class Archive現在の, nameArchiveBaseを に捨ててArchive、グローバル ファクトリ関数を使用できることはわかっています。ただし、グローバル関数の使用は避けたかったのです。