問題タブ [operator-overloading]

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

c# - C# でのインターフェイス ベースのプログラミングによる演算子のオーバーロード

バックグラウンド

現在のプロジェクトでインターフェイス ベースのプログラミングを使用していますが、演算子 (具体的には等値演算子と不等値演算子) をオーバーロードするときに問題が発生しました。


仮定

  • C# 3.0、.NET 3.5、および Visual Studio 2008 を使用しています

更新 - 次の仮定は誤りでした!

  • すべての比較で operator== ではなく Equals を使用することを要求することは、特に型をライブラリ (コレクションなど) に渡す場合には、実行可能な解決策ではありません。

operator== ではなく Equals を使用する必要があることを懸念していた理由は、.NET ガイドラインのどこにも、operator== ではなく Equals を使用すると述べているか、またはそれを提案することさえなかったからです。ただし、 Equals と Operator== をオーバーライドするためのガイドラインを読み直した後、次のことがわかりました。

デフォルトでは、演算子 == は、2 つの参照が同じオブジェクトを示しているかどうかを判断することにより、参照が等しいかどうかをテストします。したがって、参照型は、この機能を得るために operator == を実装する必要はありません。型が不変の場合、つまり、インスタンスに含まれるデータを変更できない場合、演算子 == をオーバーロードして、参照の等価性ではなく値の等価性を比較すると便利です。これは、不変オブジェクトとして long と同じと見なすことができるためです。値が同じだからです。不変でない型で operator == をオーバーライドすることはお勧めできません。

およびこの等価インターフェイス

IEquatable インターフェイスは、Contains、IndexOf、LastIndexOf、Remove などのメソッドで等しいかどうかをテストするときに、Dictionary、List、LinkedList などの汎用コレクション オブジェクトによって使用されます。ジェネリック コレクションに格納される可能性のあるすべてのオブジェクトに対して実装する必要があります。


制約

  • どのソリューションでも、オブジェクトをインターフェイスから具象型にキャストする必要があってはなりません。

問題

  • operator== の両側がインターフェースである場合、基礎となる具象型の operator== オーバーロード メソッド シグネチャが一致しないため、デフォルトの Object operator== メソッドが呼び出されます。
  • クラスで演算子をオーバーロードする場合、二項演算子のパラメーターの少なくとも 1 つが含まれている型である必要があります。そうでない場合、コンパイラ エラーが生成されます (エラー BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx )
  • インターフェイスで実装を指定することはできません

問題を示す以下のコードと出力を参照してください。


質問

インターフェイスベースのプログラミングを使用する場合、クラスに適切な演算子のオーバーロードをどのように提供しますか?


参考文献

== 演算子 (C# リファレンス)

定義済みの値の型の場合、等価演算子 (==) は、オペランドの値が等しい場合は true を返し、そうでない場合は false を返します。文字列以外の参照型の場合、2 つのオペランドが同じオブジェクトを参照している場合、== は true を返します。文字列型の場合、== は文字列の値を比較します。


関連項目


コード


出力

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

c++ - 代入演算子はさまざまなタイプのオブジェクトで機能しますか?

ごめん。エラーが発生しました。代入演算子は有効ですか?またはこれを達成する方法はありますか?【AクラスとBクラスの関係はありません。】

どうもありがとう。

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

c++ - 演算子 = C++ の Const 変数によるオーバーロード

皆さんが私を助けてくれるかどうか疑問に思っていました。

ここに私の.hがあります:

そして私のメイン:

operator= 関数を実行したい。誰でも私を助けることができますか?Doctor の const メンバーに注目してください。

************編集:************ 私の主な問題は、Pacient に Doctor があるように、別のクラスに Doctor という属性を持たせたいということです。しかし、私は私の医者を変えることができるようにしたい. 私は医者 A を見ているように、私は医者 B に会いたいと思っています。コードを実行するのが私だったら、次のように言います。

ポインタを変更します。ただし、教師の1人が作成したベースコードを使用しており、クラスは次のように定義されています。

しかし、Patient クラスの setDoctor() を使用すると、コピーを作成するか、変数自体を変更するため、これは不可能だと思います。最初のものは違いがなく、2番目のものは const のために不可能です。私は正しいですか?

0 投票する
12 に答える
26927 参照

c# - Arithmetic operator overloading for a generic class in C#

Given a generic class definition like

How can I define arithmetic operators for it?

The following does not compile, because the '+' operator cannot be applied to types 'T' and 'T':

The generic type 'T' is constrained with the 'where' keyword as you can see, but I need a constraint for number types that have arithmetic operators (IArithmetic?).

'T' will be a primitive number type such as int, float, etc. Is there a 'where' constraint for such types?

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

c# - 暗黙的演算子と明示的演算子の両方を定義できないのはなぜですか?

暗黙的演算子と明示的演算子の両方をそのように定義できないのはなぜですか?

ただし、このハックを実行できます:)

これは以下を出力します:

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

c++ - C/C++ 置換/再定義規則?

私は特に C/C++ の初心者ではありませんが、今日、予期していなかったことがいくつかわかりました。これは gcc でコンパイルされます。

これはしません:

これはどちらもしません:

同様に g++ では、これはコンパイルされます:

これはしません:

これは次のことを行います。

(標準の new 演算子を置き換えることは、上記のすべてのケースで機能します。置換 new 演算子を置き換えることは違法です。私は知っています。)

パターンを見るのは簡単ですが、誰かが「標準的な」説明をしてくれませんか? .h ファイルではできないことを .c または .cc ファイルで実行できるのはなぜですか (古い typedef を再定義し、置換が違法な関数を置換します)。


返信いただきありがとうございます。ヘッダー ガードを含む一部のコードを省略しました。最後の .cc の例では、 << を & gt として HTML エンコードしました。> cstdlib を含めるのを忘れていました。コンパイルできるようにコードを修正しました。ただし、もう 1 つ省略していたのは #define _NEW で、これは非常に重要であることがわかりました。どうやら GNU では <new> のヘッダー ガードで _NEW が定義されているため、ここでそれを定義すると、標準の新しいヘッダーを含めることができなくなり、置換が機能しました。

ええ、説明されていない唯一のことは、.c/.cc ファイルで複数回 typedef を再定義できるのに、.h ではできないということです。

とにかくそうしたいというわけではありませんが、ただ疑問に思っています。

編集:ありがとう、それは本当にすべてに答えます。それを xyz に変更すると、特定のスコープで複数の定義が許可されなくなります。これは正しいと感じます。:) 私がこれらの小さなテストを行った理由は、小さなオペレーティング システム用に C および C++ のサブセットを作成しているからですが、既存のライブラリを使用して何も削除せずにテストを支援しているため、試していました。 (1) 自分のコードがテストで呼び出されていること (例: 新しいプレースメント) と (2) 自分のコードが GNU ライブラリと衝突しないことを確認する方法を見つけます。(1) に対する答えは、かなり明白に思えます。標準 Xh から Xh にヘッダー ガード マクロを #define するだけです :)。

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

python - Pythonで++演算子をオーバーロードすることは可能ですか?

Pythonで++演算子をオーバーロードすることは可能ですか?

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

c++ - 演算子のオーバーロードを実装する最良の方法は何ですか?

私が C++ で学んだすべてのこと (それほど多くはありません) の中で、演算子のオーバーロードが最も難しいようです。一般的に、演算子のオーバーロードをフレンド関数として記述するのが最適なのはいつですか? いつ明示的に使用する必要があります*thisか? 一時オブジェクトを使用するのは常に悪いですか?

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

c# - オーバーロード演算子=C#で。他のタイプを受け入れるにはどうすればよいですか?

そのため、友人がゲームがハッキングされた方法とテクニックがどのように機能したかを教えてくれました。それから彼はその種の攻撃を防ぐための最良の方法は何かと尋ねました。私が知っていた最も簡単な方法は、A)重要な値のビットをシャッフルするB)値をハッシュし、毎回比較することでした(スコアまたはお金を保持するintはめったにチェックされない可能性があります)。

次に、C#での実装を試しましたが、=演算子をオーバーロードできませんでした。これどうやってするの?

元のコード。

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

c# - 暗黙の演算子でジェネリックを使用するにはどうすればよいですか?

非常に単純な C++ クラスがあります。

これにより、任意の型として T を持つ pt を作成できます。こちらもPt_t<s8> = Pt_t<u64>;問題なくできます。C#で同じことを行うにはどうすればよいですか? 以下を試してみましたが、エラーが発生しました。