Fehler, Irrtümer, Fragen - Seite 1357

 
Übrigens, ich verstehe diesen Code nicht, wo wird operator== aufgerufen? Er vergleicht nur zwei Longs, das ist alles
 
Alexey Navoykov:
Übrigens, ich verstehe diesen Code nicht, an welcher Stelle wird operator== aufgerufen? Es ist nur ein Vergleich von zwei Longs, das ist alles
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 kann entweder eine Vorlage oder eine allgemeine Funktion ähnlich wie ::GetPointer sein
 
A100:

...

IsEqualPointer kann entweder ein Muster oder eine allgemeine Funktion ähnlich wie ::GetPointer sein

Ich verstehe Sie überhaupt nicht, könnten Sie in menschlicher Sprache erklären, was Sie zu tun versuchen? Der angegebene Code hat Fehler (operator== hat weder Argument, noch Rückgabewert), es ist schwer, etwas von all dem zu verstehen.

Um es gleich vorweg zu sagen: Das Problem des Vergleichens/Zuordnens von Zeigern hat es noch nie gegeben, dafür reicht GetPointer(a)==GetPointer(b). Die Aufgabe betrifft also nur den Vergleich/die Zuordnung von Objekten selbst, d.h. es ist garantiert, dass diese Operationen durchgeführt werden, unabhängig davon, ob diese Objekte durch Zeiger oder Referenzen repräsentiert werden

 
Alexey Navoykov:

Der von Ihnen angegebene Code ist fehlerhaft (operator== hat kein Argument und keinen Rückgabewert), es ist schwer, aus all dem etwas zu verstehen.

Korrigiert. Es wird vorgeschlagen, operator==(...) auch für Zeiger aufzurufen, wenn es definiert ist, dann wird GetPointer(a)==GetPointer(b) dazu führen, dass a.operator==( b ) aufgerufen wird, so dass für den Vergleich von Zeigern auf Gleichheit die Verwendung von IsEqualPointer vorgeschlagen wird
 
A100:
GetPointer(a)==GetPointer(b) führt zu a.operator==( b )
Warum sollte sie das tun?
 
Alexey Navoykov:

Wie wäre es übrigens mit der Einführung der Operatoren * und & in MQL, um im ersten Fall einen expliziten Zugriff auf ein Objekt zu ermöglichen und im zweiten Fall einen Objektzeiger zu nehmen (anstelle des umständlichen GetPointer). Das Sternchen ist ein Muss, und es gibt in der Sprache nichts, was es ersetzen könnte.Ohne sie ist es unmöglich, Situationen wie die von A100 oben beschriebene zu kontrollieren, wenn statt der Objekte selbst irgendwelche Zeigeraktionen ausgeführt werden. Persönlich ist das ein ständiges Problem, ich muss ständig auf der Hut sein oder überall A.operator=(B), A.operator!=(B) angeben, d.h. die Kürze geht verloren, und das Überladen von Operatoren wird eigentlich sinnlos.

Ich habe dieses Problem schon einmal angesprochen, aber das Thema wurde abgewürgt. Lassen Sie uns dieses Thema endlich zu Ende bringen.

Danke für die Nachricht, wenn Sie die folgende Verwendung meinen:
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

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

Dem stimme ich zu, ich werde das Thema auf jeden Fall ansprechen und wir werden es diskutieren.
 
Alexey Navoykov:
Warum sollte das so sein?
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<
}
Wenn Sie operator== mit operator< gleichsetzen, ist das Ergebnis das gleiche
 
A100:
...
Wenn Sie operator== mit operator< gleichsetzen, ist das Ergebnis ebenfalls dasselbe.

Du hast nicht einmal geprüft, was du vorschlägst! Genau wie im vorherigen Fall, als es offensichtliche Fehler im Code gab, d.h. du hast nicht einmal versucht, ihn zu kompilieren. Du hast etwas auf einer Kurbel skizziert, ein paar Gedanken von dir, wie "friss es, solange ich nett bin, kein Mitleid"... Ist das richtig? Lassen wir diesen Unsinn.

Ich selbst vergleiche ständig Zeiger und Überladungsoperatoren, und es ist nie das passiert, wovon Sie jetzt träumen. Und nachdem ich jetzt Ihren Code überprüft habe, sind keine Wunder geschehen, operator== wird nicht so ausgeführt, wie es sein sollte.

 
Alexey Navoykov:

Nachdem ich nun also Ihren Code überprüft habe, sind keine Wunder geschehen, der Operator== startet nicht wie er sollte.

Der Kern des Vorschlags besteht genau darin, dass es laufen soll. Ich spreche von Änderungen am bestehenden System.
 
A100:
Der Sinn des Satzes ist ja gerade, dass er ausgelöst werden soll.

Was soll das? Es steht auf dem Kopf.

Der umgekehrte Weg ist sinnvoller: < und > sollten einen Vergleich von Zeigern bewirken.