問題タブ [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 投票する
14 に答える
2058 参照

c++ - C ++での演算子のオーバーロードは、価値があるよりも厄介ですか?

C ++を教えた私の経験では、演算子のオーバーロードは、学生に最も悲しみを与えるトピックの1つです。ここにstackoverflowで質問を見ても、たとえば、+演算子を外部またはメンバーにしますか?対称性などの扱い方は大変そうです。

C ++からJavaに移行したとき、その機能が失われるのではないかと心配していましたが、[]や()などの演算子を除いて、演算子をオーバーロードする必要性を実際に感じたことはありません。実際、それらのないプログラムの方が読みやすいと思います。

注:私はこれをコミュニティウィキとして配置しました。これについて話し合いましょう。意見を聞きたい。

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

c++ - C++ でのオーバーロード =

代入演算子をオーバーロードしようとしていますが、問題がなければいくつか解決したいと思います。

bool operator==( const MyClass& obj1, const myClass& obj2 )クラスの外で定義された非メンバー関数があります。

明らかな理由で、プライベート メンバーのいずれにもアクセスできません。

だから私がする必要があると思うのは、代入演算子をオーバーロードすることです。非メンバー関数で割り当てを行います。

そうは言っても、次のことを行う必要があると思います。

  1. my 関数を使用し、strcpyまたはを使用して情報をコピーしますstrdup。使用しstrcpyました。
  2. 代入演算子 bool MyClass::operator=( const MyClass& obj1 ); に移動します。
  3. ここで、関数のオーバーロード (==) に進み、obj2 を obj1 に割り当てます。

私はコピーコンストラクターを持っていないので、これらにこだわっています:

おそらくおわかりのように、私はこの過負荷で完全に迷っています。任意のヒント?同じ演算子を のみでオーバーロードする完成版がある::ので、プライベート メンバーはスコープを失いません。割り当てを true として返すと、で動作しmainます。これは私の本にある例です。

代入演算子をオーバーロードしてから、operator==非メンバー関数で変換を実行しますか? そのステップを完了した後、メインでオブジェクトを相互に割り当てることができますか?

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

python - Python で += をオーバーロードする方法はありますか?

plus をオーバーライドする方法については知ってい__add__ますが、それを使用して += をオーバーライドすると、次の 2 つの問題のいずれかが発生します。

(1)__add__自分自身を変異させた場合

x をそこで変異させたくない場合は、x を変異させます。

(2)__add__新しいオブジェクトを返す場合、

の実行後に z と tmp が別のオブジェクトを指しているため、 w なしで何かを返しますz += x

ある種のメソッドを作成できますが、可能であれば.append()オーバーロードしたいと思います。+=

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で++演算子をオーバーロードすることは可能ですか?