問題タブ [rule-of-three]

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 投票する
0 に答える
59 参照

c++ - C++ ベクトルは、ヒープに割り当てられたポインターを失います

説明のために、以下に簡単なプログラムを書きました。

asにはA の3 つのインスタンスが含まれていると思います。
しかし、最初の要素のポインターxは、2 回目の push_backが呼び出された後にその参照 (書き込まれたダミー値) を失い、3 回目の反復で例外がスローされます。

これはfor ループの前にas.reserve(3)を追加することで解決されます。

なぜこれが起こったのですか?

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

c++11 - 代入演算子の移動、コンストラクターの移動

私は 5 のルールを突き止めようとしてきましたが、オンラインの情報のほとんどは非常に複雑であり、サンプル コードは異なります。

私の教科書でさえ、このトピックをうまくカバーしていません。

移動中のセマンティクス:

私が理解しているように、テンプレート、右辺値、および左辺値は別として、移動セマンティクスは次のとおりです。

コピーとは対照的に、これは次のようなものと同等です。

右辺値、左辺値、またはテンプレートの説明は不要です。これらのトピックは無関係であると言えます。

最初の例が 2 番目の例よりも高速であるという事実は、当然のことです。また、C++ 11 より前の効率的なコードはすべてこれを行うことも指摘しておきます。

私の理解では、アイデアは、このすべての動作を標準ライブラリのきちんとした小さな演算子 move() にバンドルすることでした。

コピー コンストラクターとコピー代入演算子を記述するときは、単純に次のようにします。

同等のものは、次のようになります。

これがうまくいかないことは確かなので、私の質問は次のとおりです。移動セマンティクスを使用して、このタイプのコンストラクター機能をどのように実現しますか?

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

c++ - C++ のリソースとは何ですか?

このトピックに関連して:コピー アンド スワップ イディオムとは何ですか?

これは、1 つのクラスが最大で 1 つのリソースを処理する必要があることを示しています。リソース とはどういう意味ですか?

編集:たとえば、各モニターの情報を処理し、デスクトップ ピクセルの配列を含むクラスがあります。アレイとアレイのみがリソースと見なされますか? モニター情報を保持するモニターの配列とデスクトップ ピクセルの配列は、別のクラスを必要とする別のリソースでしょうか? 別のクラスですが、そういうことですか?

ここと Google を検索しましたが、3 つのルールまたはリソース ファイル (*.rc と MSDN) に関する詳細情報しか見つかりません。定義に関係するものは何もありません。

0 投票する
0 に答える
38 参照

c++ - C++ での WrapperInterface の正しい実装を見つけるためのアドバイスが必要 (3 つのルール)

インターフェイスの動作パターンを見つけようとしています。

私がしていることのいくつかの情報。dx11 でレンダリング エンジンを実装しています。私の目標は、クライアントが dx11 や高度なレンダリング技術の知識を必要としない、簡単で高度にインターフェース化されたエンジンを提供することです。

私は自分のエンジンを持っており、そのエンジンは、オブジェクト、地形、太陽、照明、水、地平線などを設定および作成する機能を提供します。

今、私は私の質問に来ます。エンジンのいわゆる MeshController は、次の 3 つのメソッドを提供します (コードは簡略化されています)。

クライアントがポインターを処理するのを避けるために、それをラッパー クラスにパックして、nullptr チェックを実行し、エンティティが既に破棄されているか既に作成されているかなどを確認します。

ラッパー:

今、私はオブジェクトが常に有効な状態であることを望んでいます。インスタンスがラッパー オブジェクトを失う前に破棄されない場合、メモリ リークが発生します (実際にはそうではありませんが、コントローラーはシーンが閉じられるまでレンダリングするか、インスタンス スロットをブロックします。全体として、クライアントは制御を失います)。インスタンス)。だから私の最初の考えはこれでした:

3 つのルールにより、コピー演算子と代入演算子が必要です。しかし、問題があります。createInstance および destroyInstance メソッドには、シーンへの追加/シーンからの削除、おそらくレンダー バッファーの再作成のため、多くのオーバーヘッドがあります ...

そのため、以前にコピーされた場合、またはオブジェクトへの有効な参照(ポインター)がある場合、オブジェクトが破棄されるのを防ぐ方法を見つけようとしています。これは典型的な動的メモリ割り当てではなく、コントローラーでのある種の割り当てです。

クライアントの典型的なユースケース:

動機付けの画像はこちらです^^ 私のレンダリングエンジンの画像

助けてくれてありがとう!

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

c++ - CppCoreGuidelines C.21 は正しいですか?

Bjarne Stroustrup の CoreCppGuidelines を読んでいるときに、私の経験と矛盾するガイドラインを見つけました。

C.21には以下が必要です。

または=deleteデフォルトの操作を定義する場合は、または=deleteそれらすべてを定義します

次の理由で:

特殊関数のセマンティクスは密接に関連しているため、1 つをデフォルト以外にする必要がある場合、他の関数も変更する必要がある可能性があります。

私の経験から、デフォルト操作の再定義の最も一般的な 2 つの状況は次のとおりです。

#1: 継承を許可するデフォルトの本体を持つ仮想デストラクタの定義:

#2: RAII 型のメンバーの初期化を行うデフォルト コンストラクターの定義:

私の経験では、他のすべての状況はめったにありませんでした。

これらの例についてどう思いますか。それらは C.21 規則の例外ですか、それともすべてのデフォルト操作をここで定義する方がよいでしょうか? 他によくある例外はありますか?

0 投票する
0 に答える
27 参照

c++ - メンバーを持つクラスを作成する方法は、独自の定義済みクラスへのポインターのベクトルです

私は C++ が初めてで、基本クラス Car へのポインターのベクトルを含む CarRental クラスを作成しようとしています。これが Car クラスです。

そして、車を保管するためのコンテナーを含むクラス CarRental を作成する必要があります。例えば、

私が書いた CarRental のクラスが正しいかどうかは疑問です。独自のコピー コンストラクターを作成する必要があるかどうかを検討しています。そして、THE BIG THREE では、代入演算子とデストラクタも必要でしょうか? 3つはメモリリークですか?例外安全性はどうですか?

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

c++ - 通常のブロック後に検出されたヒープの破損 (#181)

(まず、英語が苦手なのでごめんなさい)

私は正常に動作し、真の二乗を与える魔方陣のコードを書きました。

コンパイルしてプログラムを実行すると、何も問題はありません。

しかし、に到達すると、return 0このmain()エラーが発生します

通常のブロック後に検出されたヒープの破損 (#180)

私はそれを検索し、私のsquareクラスが 3 のルールに従っていないことを知りました ( The Rule of Three とは何ですか? )

だから私はそれを試してみましたが、再びエラーが発生しました。

これが私のコードです。

Q&A についてではありません これは編集されたコードです 新しいコードを実行するためのリンクです http://cpp.sh/72mmg