問題タブ [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 に答える
3271 参照

delphi - Delphiレコードの代入演算子をオーバーロードできますか?

動的配列を含むレコードがあります。ある配列変数を別の配列変数に割り当てる場合、実際にはその配列へのポインターのみが割り当てられるのが普通です。つまり、これを行うと、一方のサイズを変更するまで、両方の変数が同じ配列を指します。したがって、配列の別のコピーを変数に割り当てたい場合は、Copy()関数を使用します。

ただし、この場合、私の配列はレコードのフィールドです。

タイプTMyRecの2つの変数を宣言してから、一方を他方に割り当てると、両方のレコードの「配列」フィールドがメモリ内の同じアドレスを指します。

この種の問題を解決するために、次のように割り当て演算子をオーバーロードすることにしました。

これが機能する場合、TMyRecord変数を相互に割り当てた後、レコード内のすべての配列フィールドを個別にコピーする必要はありません。

これが私がすることです:

演算子のオーバーロードを希望どおりに機能させる方法はありますか?問題は、デフォルトの代入演算子をオーバーロードしようとしていることです。それは不可能ですか?

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

c++ - スマート ポインターは、ラップしているオブジェクトへの関数呼び出しを選択的に非表示またはリダイレクトできますか?

特定のオブジェクトが参照されるプロジェクトに取り組んでいます。これは、COM と非常によく似た設定です。とにかく、私たちのプロジェクトには、これらのオブジェクトに対して Add() と Release() を明示的に呼び出す必要性を軽減するスマート ポインターがあります。問題は、開発者がまだスマート ポインターを使用して Release() を呼び出している場合があることです。

私が探しているのは、スマート ポインターから Release() を呼び出すと、コンパイル時または実行時エラーが発生する方法です。コンパイル時間は私には不可能のようです。ランタイム ソリューション (以下のコードを参照) があると思っていましたが、コンパイルもうまくいきません。どうやら、operator->() を使用した後の暗黙的な変換は許可されていません。

とにかく、私が達成しようとしていることを達成する方法を誰かが考えられますか?

助けてくれて本当にありがとうございます!

ケビン

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

c++ - C++ のオーバーロード演算子、代入、ディープ コピー、および加算

私は現在、古い大学の教科書を読み直しながら演算子のオーバーロードについて調査していますが、何かを誤解していると思うので、これが一部の回答者にとって簡単な評判になることを願っています. これが重複している場合は、正しい方向に向けてください。

(この段階では) 1 つのメンバー val (int) を持つ単純なカウンター クラスを作成しました。

これらのカウンターのうち 3 つを varOne から varThree に初期化し、3 番目のカウンターを最初の 2 つの合計にします (たとえば、以下のコードでは varThree.val が 5 に設定されています)。

次のように operator+ をオーバーロードしました。

これを非メンバー関数にし、プライベート値にアクセスできるようにカウンター クラスのフレンドにしました。

私の問題は、別のプライベート メンバーpVal (int へのポインター) を追加するときに始まります。varThree = varOneこれを追加すると、varOne が破棄されても varThree.pVal は引き続き同じメモリ ビットを指しているため、単純なコピーを実行できなくなります。

私はoperator=次のようにオーバーロードしました。

varThree = varOne今、すべてが正しくコピーされるようなことをするvarThree = varOne + varTwoと、次のエラーが発生します。

counter::operator=からの戻り出力に対処するのに問題があるように見え、返される型を受け入れるためにさらにoperator+オーバーロードする必要がありますが、運がなく、何かをしたのではないかと考え始めています根本的に間違っています。operator=operator+

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

c++ - テンプレート化されたクラスでのバイナリ演算子のオーバーロード

私は最近、演算子のオーバーロード/テンプレートの能力を測定しようとしていて、小さなテストとして、以下のContainerクラスを作成しました。このコードは正常にコンパイルされ、MSVC 2008(11を表示)で正しく機能しますが、MinGW/GCCとComeauの両方がoperator+過負荷でチョークします。私はMSVCよりもそれらを信頼しているので、自分が間違っていることを理解しようとしています。

コードは次のとおりです。

これはComeauが与えるエラーです:

Comeau / MingGWにボールをプレーさせるのに苦労しているので、そこで皆さんに目を向けます。私の脳がC++構文の重みでこれほど溶けてから久しぶりなので、少し恥ずかしい思いをします;)。

編集:最初のComeauダンプにリストされている(無関係な)左辺値エラーを排除しました。

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

.net - F# と op_GreaterThan

私は最近、Microsoft Solver Foundation Services を利用して F# で何かを書き込もうとしましたが、そうしているうちに問題にぶつかりました。C# では t1 > t2 として単純に表現できる (Term > Term) 条件を表現する必要がありました。別の Term オブジェクトを返します。代わりに、F# では、t1 > t2 を使用すると項ではなく bool が生成されるのと同じ結果を得るために、Term.op_GreaterThan を呼び出す必要がありました。
F# がブール値を生成する場合にのみ op_GreaterThan を選択するのはなぜですか? また、Term が IComparable を実装していない場合、F# の t1 > t2 の解釈にはどのような意味があるのでしょうか?
構造比較の概念に基づいて平等と全体の平等でそのようなことを行う理由を理解していることに注意してください。それを「より大きい」に拡張する方法がわかりません/」

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

f# - F# と演算子のオーバーロード: (>) と (^)

では、なぜ F# で > 演算子と ^ 演算子をオーバーロードできるのに、使用できないのか説明してもらえますか?

F# コードをライブラリとしてコンパイルし、VB からそれらの演算子を使用すると、それらはすべて機能します。C# からこれらの演算子を使用すると、op_Concatenate 以外はすべて機能します (期待どおり)。しかし、F# はそれらのいくつかを無視するだけでなく、静的型チェッカーはその計画をユーザーに通知することさえしません。

コードサンプルを編集

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

c++-cli - C++/CLI で < と > をオーバーライドするにはどうすればよいですか?

andを実装し、 、、IEquatable<T>およびIComparable<T>をオーバーライドするクラスをC# から C++/CLI に移植しています。これまでのところ、私は持っています:==!=<>

ヘッダ:

ソースファイル:

オリジナルがインターフェースで同等性をテストし、オペレーターで物事を比較した理由はわかりませんが、元の構造を維持しようとしています。

とにかく、マークされた行「error C2679: binary '>' : no operator found which takes a right-hand operand of type 'ThingNamespace::Thing' (or there is no acceptable conversion)」でコンパイルエラーが発生し、対応するエラーが2行下にあります。オーバーロードされた演算子の存在を検出しないのはなぜですか?

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

c++ - C++ シフト演算子の優先順位の奇妙さ

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

奇妙なことに、コンパイラはintResult1 BEFORE intResult0を評価するコードを生成します(最新の VC と gcc でテスト済み)。なぜコンパイラはこれを行うのでしょうか? そうすることで、それぞれの値の評価と使用の間の時間が (不必要に) 増加します (?)。つまり、42 が最初にフェッチされますが、最後にベクトルにプッシュされます。C++ 標準はこれを規定していますか?

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

c++ - カスタム C++ クラスのバグ

3D 位置を管理するためにカスタム C++ クラスを使用して問題を見つける方法について、助けが必要です。クラスの関連コードは次のとおりです

ここでは次のように使用しています。

nodo[i] は Punto* で、問題なくコンパイルされますが、実行しようとすると:

コンパイラは次のように述べています。

メンバ関数void mdTOT::pintarElementosFrontera()': error: invalid operands of types Punto*' およびPunto*' to binary operator+' 内

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

c# - C#でジェネリックキャスト演算子を次のようにオーバーロードすることは可能ですか?

C#3.5で次のコードを表す方法があるかどうか疑問に思っています。

ありがとう