class A { public:
booloperator==( const A& ) { Print(__FUNCTION__); return true; }
};
class B {};
voidOnStart()
{
bool res;
A *a1, *a2;
B *b1, *b2;
res = a1 == a2; //сейчас сравниваются указатели //предлагается вызывать operator==()
res = b1 == b2; //сравниваются указатели (предложение здесь ничего не меняет, поскольку нет B::operator==)
res = IsEqualPointer( a1, a2 ); //сравниваются указатели
}
ところで、このコードがよくわからないのですが、どの場所で operator== が呼ばれるのでしょうか? 2つの長さを比較するだけです。
...
IsEqualPointerはパターンでも,::GetPointerに似た一般的な関数でもよい.
全く理解できません。何をしようとしているのか、人間の言葉で説明してください。 与えられたコードにはエラーがあり(operator==には引数も戻り値もない)、これだけでは何も理解できません。
ポインタの比較・代入という問題は、これまで存在しなかった。GetPointer(a)==GetPointer(b) で十分である。 つまり、このタスクはオブジェクト自体の比較・代入のみに関係しており、これらのオブジェクトがポインタや参照で表現されていても、その演算は保証されているのである。
与えられたコードにはエラーがあり(operator==には引数も戻り値もない)、これだけでは何も理解できません。
GetPointer(a)==GetPointer(b) で a.operator==( b ) となる。
ところで、MQLに*と &の 演算子を導入して、前者ではオブジェクトへの明示的なアクセスを可能にし、後者では(面倒なGetPointerの代わりに)オブジェクトポインタを 取るというのはどうでしょう。 アスタリスクは必須で、これに代わるものは言語には存在しないのです。これがないと、上記A100のような、オブジェクトそのものではなく、何らかのポインタ動作が行われるような状況を制御することができません。 個人的には、これは常に問題で、常に警戒していないと、いたるところでA.operator=(B)、A.operator!=(B)と指定しなければならず、すなわち簡潔さが失われ、演算子のオーバーロードは実際には無意味になります。
以前にも一度、この問題を提起したのですが、話題が滞ってしまいました。 ようやくこの問題を終わらせることができました。
それは同感です、必ず問題提起をしますし、議論します。
なぜそうなるのでしょうか?
...
operator== と operator< を同一視すると、結果も同じになります。
あなたは、自分が提案したことを確認さえしなかった!前のケースと同じように、コードに明らかな誤りがあったとき、つまり、コンパイルしようともしなかった。 あなたは、クランクに何かをスケッチし、「私が親切であるうちに食べなさい、同情はしない」というような、あなたの考えを書きました...。そうなんですか、こんなくだらないことはやめましょうよ。
私自身、ポインタとオーバーロード演算子を常に比較していますが、あなたが今夢見ているようなことは一度もありませんでした。 そして今、あなたのコードをチェックしたところ、奇跡は起きず、operator==は本来実行されるべきではありません。
さて、あなたのコードをチェックしたところ、奇跡は起こらず、operator==は本来あるべき姿のまま起動しません。
この文章のポイントは、まさに「トリガーになるべき」ということです。
何それ、逆さまじゃん。
< と > はポインタの比較を行うべきであり、逆の方が理にかなっています。