問題タブ [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.
c++ - 3 のルールに違反していますか?
最近、Rule of Three を読みましたが、これに違反しているのでしょうか?
私の GUI アプリケーションではMainFrame
、Interface
、Circuit
、Breadboard
などのクラス (クラス名は指標です) には、それぞれのインスタンスが 1 つあります。それらのコンストラクターで、いくつかのリソース (メモリ) を割り当て、それらをデストラクタで安全に解放します。
したがって、デストラクタのみを定義しましたが、コピー コンストラクタと代入演算子は定義しませんでした。
私はそれらを必要としないと確信していますが、規則に違反しているかどうか、また規則に従うために何ができる/すべきか知りたいです?
c++ - C++での3つのルール
三つのルール、三つのルールとは何ですか?要約すると次のようになります。
デストラクタ、コピーコンストラクタ、またはコピー代入演算子のいずれかを自分で明示的に宣言する必要がある場合は、おそらく3つすべてを明示的に宣言する必要があります。
私の質問は次のとおりです。C++アプリケーションには、リソースを管理するクラスがあります(ポインターの削除を処理するデストラクタがあります)。アプリケーションが至る所で代入演算子を使用していることは知っていますが、コピーコンストラクターのアプリケーション、つまり型の使用法は絶対にないClass c(..); Class d(c);
ので、このような状況でも、両方を実装する必要がありますか?代入演算子とコピーコンストラクタ?それとも、代入演算子だけで十分でしょうか?代入演算子がどういうわけかコピーコンストラクターを使用することは可能ですか?
あなたの考えに感謝します。
c++ - -Weffc++を理解する
次のプログラムを検討してください。
-Weffc++
これは、 GCC 4.7.1でコンパイルすると、次のように吐き出されます。
この例のいくつかのことを除いて、これは通常は問題ありません。
コンストラクター、ポインター宣言、または文字列宣言のいずれかをコメントアウトすると、警告が消えます。ポインタだけで十分だと思うので、これは奇妙ですが、そうではありません。さらに、文字列宣言を整数宣言に変更すると、それも非表示になるため、文字列(またはおそらく他の選択クラス)が含まれている場合にのみ表示されます。このような状況で警告が消えるのはなぜですか?
多くの場合、この警告は、ポインターが実行しているのが既存の変数(ほとんどの場合OSによって維持されている)を指しているときに発生します。、、
new
はありませんdelete
。このような場合、ハンドル付きのクラスをコピーするときに、深いコピーは必要ありません。両方のハンドルが同じ内部オブジェクト(たとえば、ウィンドウなど)を指すようにします。コピーコンストラクターと代入演算子を不必要にオーバーロードしたり、警告を完全に無効にしたりせずに、コンパイラーにこれを認識させる方法はあります#pragma
か?三つのルールが適用されないのに、そもそもなぜ私は悩まされているのですか?
c++ - ベクトルはコンテンツを正しく消去しません (クラッシュするまでコピー代入演算子の無限の実行 [BEX])?
私の問題は、ロードされた DLL を「アンロード」した後、コピー代入演算子がクラッシュするまで無制限に呼び出されることです。
ベクター データを削除するコードは次のようになります。
ただし、「[DBG]UnloadPlugins()::Done」は印刷されません。
これは私のコピー代入演算子です:
したがって、ログは次のようになります。
問題は何でしょうか?
c++ - デフォルトのコンストラクターがありません - しかし、私はそれを呼び出していませんか?
Controller
次のようにヘッダー ファイルで定義された 2 つのネストされた構造体を持つクラスを持つ C++ アプリケーションを作成しています。
私のソースファイルには、これがあります:
これは問題ないと思いましたが、コンパイルすると、次のようになります (controller.cpp の 12 行目は、上記のソース スニペットの最初の行です)。
私が推測できることから、コンパイラはどこかでhelp_message
、存在しないデフォルトのコンストラクタを呼び出そうとしています。次に、作成したコンストラクター、生成されたコピー コンストラクターおよび代入演算子と呼び出しを一致させようとし、引数の数でそれぞれ失敗します。
しかし、私のコードのどの部分が既定のコンストラクターを呼び出しているのでしょうか? そして、どうすればこのエラーを修正できますか?
c++ - 3 つのルールの例外?
C++ Rule of Threeについて多くのことを読みました。多くの人がそれを誓います。しかし、ルールが述べられている場合、ほとんどの場合、例外があることを示す「通常」、「可能性が高い」、「おそらく」などの単語が含まれています。これらの例外的なケースが何であるかについての議論はあまり見たことがありません.3つのルールが成り立たないケース、または少なくともそれを順守しても利点がないケースです。
私の質問は、私の状況が 3 つのルールの正当な例外であるかどうかです。以下で説明する状況では、明示的に定義されたコピー コンストラクターとコピー代入演算子が必要ですが、既定の (暗黙的に生成された) デストラクタは正常に機能します。これが私の状況です:
A と B の 2 つのクラスがあります。ここで問題になっているのは A です。B は A のフレンドです。A には B オブジェクトが含まれています。B には、B オブジェクトを所有する A オブジェクトを指すことを意図した A ポインターが含まれています。B は、このポインターを使用して、A オブジェクトのプライベート メンバーを操作します。B は、A コンストラクター以外でインスタンス化されることはありません。このような:
と...
なぜそのようなクラスを設定するのでしょうか? 私は約束します、私には正当な理由があります。これらのクラスは、実際には、ここに含めた以上のことを行います。
残りは簡単ですよね?リソース管理もビッグスリーも問題ありません。違う!A の既定の (暗黙的な) コピー コンストラクターでは十分ではありません。これを行う場合:
a2
と同一の新しい A オブジェクトを取得します。これは、と同一であり、まだ を指していることを意味しa1
ます。これは私たちが望んでいるものではありません。デフォルトのコピー コンストラクターの機能を複製し、新しい A オブジェクトを指すようにnew を設定する A のコピー コンストラクターを定義する必要があります。このコードを に追加します。a2.b
a1.b
a2.b.ap
a1
A::b.ap
class A
コピー代入演算子は同じ理由で必要であり、デフォルトのコピー代入演算子の機能を複製してから を呼び出す同じプロセスを使用して実装されますb.init( this );
。
ただし、明示的なデストラクタは必要ありません。したがって、この状況は 3 つのルールの例外です。私は正しいですか?
c++ - C++ デストラクタ、動的割り当て
最近、デストラクタがないためにいくつかのエラー (bad_alloc) が発生しました。
現在、次のように設定された2つのクラスがあります。
ここに ObjTwo の operator= があります
まず、私の仮定は次のとおりです(間違っている場合は修正してください):
ObjOne はデストラクタを必要としません。これはプリミティブ型のみであり、コンパイラがデフォルトのデストラクタを使用してクリーンアップする場合です。ObjTwo DOES には ObjOne が含まれているため、デストラクタが必要です。 ObjTwo デストラクタは、x、num、および myObjOne からメモリの割り当てを解除する必要があります。
これを使ってデストラクタをいくつか試してみましたが、依然として bad_alloc エラー (巨大なループなどでテストする場合) またはその他のエラー (現在のエラーでは、デストラクタが呼び出されるとクラッシュするだけ) に遭遇します。
私が間違っていることについてのガイダンスをいただければ幸いです
編集:これを単にループに入れると、bad_alloc例外がスローされます:
これはオーバーロードされた == 演算子です
エラーを読んだ後、メモリ不足が原因であると思われました。私の機能していないデストラクタが引き起こすでしょう。ここで何が問題になる可能性がありますか?
get メソッドは単純に jon[i]; を返します。
c++ - メモリ管理 : 文字配列と = 演算子
メモリ管理 : 文字配列と = 演算子
Q. メモリ管理に関して、次のコードでどのようなエラーが発生しますか?
答え。手がかりがありません... 助けていただけますか?配列のサイズは大丈夫そうです...新しい演算子...削除演算子がないため、ポインタがぶら下がっているためですか?それとも3のルール?
助けていただければ幸いです。私にお知らせください。ありがとう、
c++ - さまざまなタイプの C++ テンプレート エラー
以下から、考えられるすべての、少なくとも 3 つのエラーを見つける必要があります。
私の答えは
typename A と B は、エラーを発生させる異なる型を持つことができます。さらに悪いことに、演算子 < は関数で定義されていません。
typename C は A および B とは異なる場合があり、const で定義されている a、b オブジェクトに変更を加えます。
typename A は整数型にすることができますが、整数型には定数参照を使用せず、オブジェクトにのみ使用します。
私の3番目の答えは間違っていました....
私の答えが間違っていた理由と、このテンプレートから発生する可能性のあるすべてのエラーを誰か説明できますか? 最初の 2 つの回答の功績は認められましたが、あまり好きではありません。誰もこれに対するより良い解決策を持っていますか?
ありがとう、