問題タブ [assignment-operator]

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

c++ - 定数クラスメンバー、代入演算子、QList

私が正しければ適合し、より良い解決策があるかどうか教えてください:

のような定数メンバーを持つオブジェクトint const width;は、コンパイラによって暗黙的に作成される合成代入演算子では処理できないことを理解しています。しかし、QList(そして私はstd :: listもそうだと思います)には、実用的な代入演算子が必要です。したがって、定数メンバーとQListを持つオブジェクトを使用する場合、次の3つの可能性があります。

  1. 定数メンバーは使用しないでください。(解決策ではありません)
  2. 自分の代入演算子を実装します。
  3. 代入演算子を必要としない他のコンテナを使用する

あれは正しいですか?他にエレガントな解決策はありますか?

また、私は私ができるかどうか疑問に思います:

  • (4)コンパイラに定数メンバーを処理する代入演算子を作成させます!(なぜこれがそんなに大きな問題なのかわかりません。なぜオペレーターは初期化リストを内部で使用するのに十分な知性を持っていないのですか?それとも何かが足りないのですか?)
  • (5)リストで代入演算を使用しないことをQListに伝えます。

編集:私はこのクラスのオブジェクトを自分で割り当てることはありません。これらは、コピーコンストラクターまたはオーバーロードされたコンストラクターによってのみ作成されます。したがって、代入演算子は、私自身ではなく、コンテナによってのみ必要とされます。

EDIT2:これは私が作成した代入演算子です。それが正しいかどうかはわかりませんが。Cellには2つのパラメーターコンストラクターがあります。これらのパラメーターは、初期化リストを使用して2つの定数メンバーを設定します。ただし、オブジェクトには他の変数(非const)メンバーも含まれています。

EDIT3:私はこのスレッドをほぼ同じ質問で見つけました:C ++:constクラスメンバーとのSTLトラブルすべての答えを組み合わせて私の質問に答えました。

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

c++ - 仮想基底クラスの代入演算子が 1 回だけ呼び出されるようにするにはどうすればよいですか?

典型的なダイヤモンドの問題のように、仮想継承を使用しています。

すべてのクラスに「deep_copy_from」という名前のメソッドを実装しています (ただし、代入 operator=() の場合もあります)。このメソッドは、クラス独自の属性をコピーし、そのコピーを上のクラスに伝達する必要があります。

問題は、D インスタンスをディープ コピーしているときに A::deep_copy_from メソッドが 2 回呼び出されることです (A の「バージョン」は 1 つしかないため、1 回だけ呼び出す必要があります)。一度だけ呼び出されるようにする最善の方法は何ですか?

(B::deep_copy_from と C::deep_copy_from は引き続き同じように動作するはずです)。

サンプルコードは次のとおりです。

現在の出力は次のとおりです。

アップデート:

現在のバージョンは次のとおりです。

出力は次のとおりです。

それよりも良いものを手に入れることはできますか?(つまり、より自動化された)

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

c++ - C++ 代入演算子の解決

次のコードを検討してください。

次に、このメンバーを呼び出すと、次のようになります。

印刷されます:

質問: なぜ B::foo は A::foo を隠しますが、B::operator= は隠しませんか?

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

c++ - テンプレート化されたクラスでの c++ 代入演算子の実装

C++ の理解を深めるために、独自のマトリックス クラスを構築しています。テンプレート化されているので、int マトリックス、float、または boolean マトリックスを使用できます。動的メンバー要素を持たないため、コピー コンストラクター、代入演算子、またはデストラクターを実装するつもりはありませんでしたが、次の場合:

次のエラーが返されます。

2 つの行列が両方とも float または両方とも int であれば問題ありません。寸法が一致している必要はありません。したがって、型が異なる場合を除き、デフォルトの代入演算子はうまく機能します。そこで、独自の代入演算子を実装します。

これは、タイプが異なるが同じ次元である場合に機能しますが、2 番目の値は 2 番目のタイプから 1 番目のタイプに変換されます。私の質問は、それらが異なるタイプと異なる次元になるように設定するにはどうすればよいですか?そして、これを2番目または2番目のコピーを指すように設定するだけです?

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

ruby - 割り当ての演算子の優先順位と条件演算子

Ruby1.8と1.9用の「TheRubyProgrammingLanguage」という本を読んでいます。この本は、if-operatorの優先順位はassignment-operatorよりも低いと述べています。これが本当なら、私はこの式がどのように機能するかを理解していません:

x = 5 if false

代入演算子の優先順位が高い場合は、if演算子の前に実行する必要があります。したがって、実行する前に5をxに割り当てる必要がありますif false

私は優先順位を誤解していますか?

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

c++ - クラス代入演算子

次の演算子のオーバーロードテストを行いました。

代入演算子は期待どおりに動作し、他のインスタンスのアドレスを出力します。

では、実際に他のインスタンスから何かを割り当てるにはどうすればよいでしょうか。たとえば、次のようなものです。

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

c++ - オブジェクトを宣言するときにコンストラクタも代入演算子も実行されないのはなぜですか?

テストプログラムは

出力

は、「b」とは異なり、オブジェクト「a」が代入演算子を実行せずに「直接」A(1)から構築されたことを示しています。しかし、コピーコンストラクターも実行されませんでした。なんで?この場合、代入演算子を強制的に実行する方法はありますか?私が書いたらそのような行動を期待したでしょう

でも私はしたい

これは最初のケースとは異なる必要があります。か否か?

(実際、問題は、Aから派生したクラスBがあり、Aの代入演算子にA a = B(...)のような宣言を処理させたい場合に発生します。)

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

c++ - C ++(a = b)=cを回避するために代入演算子がconstrefを返す必要がある理由

私はC++について、より正確には演算子のオーバーロードについての本を読んでいます。

例は次のとおりです。

refの代わりにconstrefを返すことについての本によって提供される説明は、(x = y)=zのような割り当てを避けることです。なぜこれを避けるべきなのか分かりません。この例ではx=yが最初に評価され、const参照が返されるため、=z部分を実行できないことを理解しています。しかし、なぜ?

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

c++ - C++でintからオブジェクトへの代入をどのように行うことができますか?

こんにちは、みんな

上記のような単純なクラスを宣言しただけです。
その後、そのクラスのオブジェクトに int 値を割り当てたところ、うまくいきました!
(値を出力しました。適切に保存されていました)

int パラメータを持つコンストラクトがない場合、コンパイル エラーが発生しました。
だから、それはコンストラクターに関連していると思います。そうですか?

良い説明をお願いします。
ありがとう。

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

c++ - C++: 自分の型に対して独自の代入演算子を定義しましたが、今度は .sort() が自分の型のベクトルで機能しませんか?

次のように定義されたクラスがあります (Accelerated C++ を読んだことがある人は、このクラスになじみがあるかもしれません)。

関数calculator()は、このタイプのオブジェクトを利用します。関数の一部として、(既に宣言されている) Student_info オブジェクトのベクトルは、ライブラリの汎用ソート関数を使用してソートされます。私のプログラムはこの時点を過ぎても進行しません (ただし、NetBeans によると、例外はスローされず、プログラムは正しく終了します)。

sort 関数は、コンテナーに保持されている型の代入演算子を多用しますが、定義したものの何が問題なのかを見つけることができないようです (定義する前に、プログラムは適切に機能していました)。Accelerated C++ によると (または、少なくともこれが私が解釈した方法です)、代入演算子が機能するはずの適切な方法は、最初に左のオペランドを破棄し、次に右のオペランドと等しい値で再度構築することです。したがって、これは私のオーバーロードされた operator= 定義です。

ご覧のとおり、以下で定義されている Student_info コピー コンストラクターを呼び出します。

sort ステートメントを省略すると、プログラムが正しく機能し、copyCount (コピー コンストラクターと operator= でのみ変更される) が 0 より大きいため、コピー コンストラクターは正しく機能します。

では、代入演算子の何が問題なのですか? 呼び出し元の Student_info オブジェクトの破棄と関係がありますが、破棄しない以外に修正する方法がわかりません。

(ちなみに、コピー コンストラクタ、デストラクタ、および代入演算子の作成は、Accelerated C++ の演習で必要になります...これらの関数の合成バージョンが私のクラスには明らかに十分であることを認識しています)