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

 
Gustavo Hennemann:

Hallo @Alain Verleyen,

ich habe die Methode getPrice() geändert, statt CopyClose() verwende ich 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.

Zeigen Sie bitte Ihren aktualisierten Code.
 

Offenbar habe ich das Problem gelöst, indem ich den Operator "&" in der Funktion Compare() verwendet habe, um den Wert von "this" zu erhalten:


int PriceScore::Compare(const CObject *node,const int mode=0) const
{
   PriceScore *thisObject = (PriceScore*)&this;
   PriceScore *pc = (PriceScore*)node;

   Print(__FUNCTION__,":Compare called. Incoming: ", pc.Score()," This: ", score);
   
   if(pc.Score() < thisObject.getPrice())
      return 1;
   else if(pc.Score() > thisObject.getPrice())
      return -1;
   else
      return 0;
}


Schließlich erhielt ich den Wert, den ich erwartet hatte.

 

Sie können thisObject weglassen und durch "this" im Vergleich ersetzen.

Aber warum verwenden Sie nicht die "Operator" -Funktionalität anstelle einer Funktion "Vergleichen"? Das macht den Code später einfacher zu lesen.

 
Doerk Hilger:

Sie können thisObject weglassen und durch "this" im Vergleich ersetzen.

Aber warum verwenden Sie nicht die "Operator" -Funktionalität anstelle einer Funktion "Vergleichen"? Das macht den Code später einfacher zu lesen.


Weil es sich um eine polymorphe Methode der Basisklasse CObject handelt und diese überschrieben werden muss, um das Sortieren und Suchen in den Collection-Klassen CArrayObj und CList zu implementieren.

 
Gustavo Hennemann:

Offenbar habe ich das Problem gelöst, indem ich den Operator "&" in der Funktion Compare() verwendet habe, um den Wert von "this" zu erhalten:



Schließlich erhielt ich den Wert, den ich erwartet hatte.


Ich bin mir nicht sicher, was Sie mit dieser Logik zu erreichen hoffen. Normalerweise möchte man nur die gleichen Elemente zum Sortieren und Suchen vergleichen.

...
if(this.thingToSort > other.thingToSort) return 1;
...
 
nicholishen:

Ich bin mir nicht sicher, was Sie mit dieser Logik zu erreichen hoffen. Normalerweise würden Sie nur die gleichen Elemente zum Sortieren und Suchen vergleichen wollen.

Genau, jetzt wird sortiert, vorher konnte ich den Vergleich nicht machen, ich bekam Fehler und Fehler und Fehler. Jetzt funktioniert es.

Dieser Ansatz ist nicht offensichtlich und steht in keinem Dokument, ich musste eine Menge Tests und "Versuch und Irrtum" machen, bis ich das hinbekam. Ich hoffe, andere können sich an der Lösung erfreuen.

 
Gustavo Hennemann:

Genau, jetzt sortiert es, vorher konnte ich den Vergleich nicht machen, ich bekam Fehlermeldungen und Fehlermeldungen und Fehlermeldungen. Jetzt funktioniert es.

Dieser Ansatz ist nicht offensichtlich und steht in keinem Dokument, ich musste eine Menge Tests und "Versuch und Irrtum" machen, bis ich das hinbekam. Ich hoffe, andere können sich an der Lösung erfreuen.


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


int PriceScore::Compare(const CObject *node,const int mode=0) const
{
   /* PriceScore *thisObject = (PriceScore*)&this; */
   PriceScore *pc = (PriceScore*)node;

   Print(__FUNCTION__,":Compare called. Incoming: ", pc.Score()," This: ", score);
   
   if(pc.Score() < /*thisObject.*/getPrice())
      return 1;
   else if(pc.Score() > /*thisObject.*/getPrice())
      return -1;
   else
      return 0;
}
 
Ex Ovo Omnia:

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


Es ist das Äquivalent zur Verwendung von GetPointer(this)
 
nicholishen:
Es ist das Äquivalent zur Verwendung von GetPointer(this)

Nun, das beantwortet nicht die Frage nach dem "Warum". Es gab keinen Grund, den Zeiger auf sich selbst preiszugeben.

 
Ex Ovo Omnia:

Nun, das beantwortet nicht die Frage nach dem "Warum". Es gab keinen Grund, den Zeiger auf sich selbst preiszugeben.

Nein, definitiv nicht in diesem Beispiel, da es sich um eine redundante Extraktion handelt, aber nehmen wir an, Sie würden dies an eine Methode übergeben, die nur einen Zeiger akzeptiert, dann müssten Sie es verwenden... method(&this)