Wie zu überschreiben Compare() in CObject so CList sort() funktioniert? - Seite 4

 
Ex Ovo Omnia:

Ich bin nur neugierig, warum Sie den Operator "&" in der Funktion Compare() benötigten, um den Wert von "this" zu erhalten.


Weil die Methode Compare() "const" ist, und es nicht möglich ist, nicht "const"-Methoden darin aufzurufen.

In diesem Beispiel, siehe Code auf Seite 2, ist die Methode getPrice() nicht const und die darin enthaltene Funktion CopyClose() ist ebenfalls nicht const. Alle Methoden können in "const" umgewandelt werden, CopyClose() jedoch nicht.

Wie auch immer, der Operator "&" ermöglicht den Zugriff auf Methoden, die nicht const sind, so dass wir sie innerhalb einer"const"-Methode aufrufen können.

 
Gustavo Hennemann:

Denn die Methode Compare() ist "const", und es ist nicht möglich, darin Methoden aufzurufen, die nicht "const" sind.

In diesem Beispiel, siehe Code auf Seite 2, ist die Methode getPrice() nicht const und die darin enthaltene Funktion CopyClose() ist ebenfalls nicht const. Alle Methoden können in "const" umgewandelt werden, CopyClose() jedoch nicht.

Wie auch immer, der Operator "&" gibt Zugang zu Methoden, die nicht const sind, so dass wir sie innerhalb einer"const"-Methode aufrufen können.


Jetzt verstehe ich. Ich habe keine Ahnung, ob es eine gültige Konstruktion ist, vielleicht wissen Sie es. Für mich ist es besser, die Deklaration von "const"-Methoden in MQL komplett zu vermeiden, wie in Java.

 
Ex Ovo Omnia:

Jetzt verstehe ich. Ich habe keine Ahnung, ob es eine gültige Konstruktion ist, wahrscheinlich wissen Sie es. Für mich ist es besser, 'const'-Methoden-Deklarationen in MQL komplett zu vermeiden, wie in Java.


Um die (sehr nützlichen) Methoden der std library's collection classes (z.B. search, sort, etc.) zu nutzen, muss man die Compare Methode von CObject überschreiben. Das bedeutet, dass alle Methoden, die aus der Compare-Methode heraus aufgerufen werden, auch const-Methoden sein müssen. OP hat dieses Detail nicht umgangen, er hat nur den'this'-Zeiger nicht korrekt verwendet. Anstatt also einfach this.DoSomething() aufzurufen, hat OP seinen eigenen Zeiger auf (self)object erstellt. z.B. otherSelfPointer.DoSomething()

 
nicholishen:

Um die (sehr nützlichen) Methoden der Auflistungsklassen der Standardbibliothek (z. B. Suchen, Sortieren usw.) nutzen zu können, müssen Sie die Compare-Methode von CObject außer Kraft setzen. Das bedeutet, dass alle Methoden, die aus der Compare-Methode heraus aufgerufen werden, auch const-Methoden sein müssen. OP hat dieses Detail nicht umgangen, er hat nur den this-Zeiger nicht korrekt verwendet. Anstatt also this.DoSomething() aufzurufen, hat OP seinen eigenen Zeiger auf (self)object erstellt, anstatt einfach das this-Schlüsselwort zu verwenden. z.B. otherSelfPointer.DoSomething()


Ich verstehe, was er getan hat, die Frage ist nun, ob diese Konstruktion (im Allgemeinen) harmlos ist. Der Compiler erwartet nicht, dass das Objekt seine Mitglieder in const-Funktionen modifiziert.

 
Ex Ovo Omnia:

Ich verstehe, was er getan hat, die Frage ist nun, ob diese Konstruktion harmlos ist (im Allgemeinen). Der Compiler erwartet nicht, dass das Objekt seine Mitglieder in const-Funktionen ändert.

In diesem speziellen Fall erhalte ich nur den Wert, ich ändere nichts. Wenn wir aber versuchen, einen Konst-Wert zu ändern, wird der Compiler wahrscheinlich eine Warnung ausgeben, oder im schlimmsten Fall eine Laufzeit-Exception auslösen.

 
Ex Ovo Omnia:

Ich verstehe, was er getan hat, die Frage ist nun, ob diese Konstruktion harmlos ist (im Allgemeinen). Der Compiler erwartet nicht, dass das Objekt seine Mitglieder in const-Funktionen modifiziert.


Ohhh.... Ich sehe jetzt, mein Fehler. Das könnte potentiell gefährlich sein. OP sollte sicherstellen, dass alle Methoden innerhalb der Reichweite von Compare() auch const-Methoden sind.

 
Gustavo Hennemann:

Hallo @Alain Verleyen,

Ich habe die Methode getPrice() geändert, statt CopyClose() verwende ich jetzt CopyBuffer(). Das ändert aber nichts am Hauptziel.

Wenn ich also das Schlüsselwort "const" in der Methode getPrice() verwende, erhalte ich die Fehlermeldung: "'CopyBuffer' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden". Ich denke, dies tritt auf, weil CopyBuffer keine const-Methode ist und es nicht möglich ist, eine nicht-konst-Methode innerhalb einer const-Methode aufzurufen.

Sorry für die späte Antwort, aber ich hatte keine Zeit, das Thema bis jetzt zu verfolgen.

Ich verstehe immer noch nicht, warum Sie Ihre getPrice() nicht als const deklarieren konnten, wenn Sie CopyBuffer() verwenden. Das ergibt für mich keinen Sinn. Könnten Sie Ihre aktualisierte Version von getPrice() posten?

 

Alle Aktualisierungen