エラー、バグ、質問 - ページ 1357

 
ところで、このコードがよくわからないのですが、operator== はどこで呼ばれるのでしょうか? これは単に2つの長さを比較するだけです。
 
Alexey Navoykov:
ところで、このコードがよくわからないのですが、どの場所で operator== が呼ばれるのでしょうか? 2つの長さを比較するだけです。
class A { public:
        bool operator==( const A& ) { Print(__FUNCTION__); return true; }
};
class B {};
void OnStart()
{
        bool res;
        A *a1, *a2;
        B *b1, *b2;
        res = a1 == a2; //сейчас сравниваются указатели
                        //предлагается вызывать operator==()
        res = b1 == b2; //сравниваются указатели (предложение здесь ничего не меняет, поскольку нет B::operator==)
        res = IsEqualPointer( a1, a2 ); //сравниваются указатели
}
IsEqualPointer はテンプレートか ::GetPointer のような一般的な関数にすることができる.
 
A100:

...

IsEqualPointerはパターンでも,::GetPointerに似た一般的な関数でもよい.

全く理解できません。何をしようとしているのか、人間の言葉で説明してください。 与えられたコードにはエラーがあり(operator==には引数も戻り値もない)、これだけでは何も理解できません。

ポインタの比較・代入という問題は、これまで存在しなかった。GetPointer(a)==GetPointer(b) で十分である。 つまり、このタスクはオブジェクト自体の比較・代入のみに関係しており、これらのオブジェクトがポインタや参照で表現されていても、その演算は保証されているのである。

 
Alexey Navoykov:

与えられたコードにはエラーがあり(operator==には引数も戻り値もない)、これだけでは何も理解できません。

修正しました。ポインタに対しても operator==(...) が定義されていればGetPointer(a)==GetPointer(b ) が呼ばれるので、ポインタが等しいかどうかを比較するには IsEqualPointer を使用することが推奨されます。
 
A100:
GetPointer(a)==GetPointer(b) で a.operator==( b ) となる。
なぜ、そんなことをするのでしょうか?
 
Alexey Navoykov:

ところで、MQLに*と &の 演算子を導入して、前者ではオブジェクトへの明示的なアクセスを可能にし、後者では(面倒なGetPointerの代わりに)オブジェクトポインタを 取るというのはどうでしょう。 アスタリスクは必須で、これに代わるものは言語には存在しないのです。これがないと、上記A100のような、オブジェクトそのものではなく、何らかのポインタ動作が行われるような状況を制御することができません。 個人的には、これは常に問題で、常に警戒していないと、いたるところでA.operator=(B)、A.operator!=(B)と指定しなければならず、すなわち簡潔さが失われ、演算子のオーバーロードは実際には無意味になります。

以前にも一度、この問題を提起したのですが、話題が滞ってしまいました。 ようやくこの問題を終わらせることができました。

メッセージありがとうございます!以下の使い方のことでしたら
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

*pf1!=*pf2
*pf1=*pf2;

それは同感です、必ず問題提起をしますし、議論します。
 
Alexey Navoykov:
なぜそうなるのでしょうか?
class A { public:
        bool operator ==( const A& ) { Print( __FUNCSIG__ ); return true; }
        bool operator  <( const A& ) { Print( __FUNCSIG__ ); return true; }
};
void OnStart()
{
        bool res;
        A a1, a2;
        res = GetPointer( a1 ) == GetPointer( a2 ); //сейчас сравниваются указатели, а будет вызываться operator==, как сейчас происходит для следующей строки
        res = GetPointer( a1 )  < GetPointer( a2 ); //вызывается operator<
}
operator== と operator< を同一視すると、結果は同じになります。
 
A100:
...
operator== と operator< を同一視すると、結果も同じになります。

あなたは、自分が提案したことを確認さえしなかった!前のケースと同じように、コードに明らかな誤りがあったとき、つまり、コンパイルしようともしなかった。 あなたは、クランクに何かをスケッチし、「私が親切であるうちに食べなさい、同情はしない」というような、あなたの考えを書きました...。そうなんですか、こんなくだらないことはやめましょうよ。

私自身、ポインタとオーバーロード演算子を常に比較していますが、あなたが今夢見ているようなことは一度もありませんでした。 そして今、あなたのコードをチェックしたところ、奇跡は起きず、operator==は本来実行されるべきではありません。

 
Alexey Navoykov:

さて、あなたのコードをチェックしたところ、奇跡は起こらず、operator==は本来あるべき姿のまま起動しません。

提案の本質は、まさに「走ること」です。既存のシステムを変えるという話です。
 
A100:
この文章のポイントは、まさに「トリガーになるべき」ということです。

何それ、逆さまじゃん。

< と > はポインタの比較を行うべきであり、逆の方が理にかなっています。