¿Cómo anular Compare() en CObject para que funcione CList sort()? - página 3

 
Gustavo Hennemann:

Hola @Alain Verleyen,

He cambiado el método getPrice(), en lugar de usar CopyClose() estoy usando CopyBuffer(). Esto no cambia el objetivo principal.

Entonces, si utilizo la palabra clave "const" en el método getPrice(), me sale el error "'CopyBuffer' - no se puede aplicar ninguna de las sobrecargas a la llamada de la función". Creo que esto ocurre porque CopyBuffer no es un método const, y no es posible llamar a un método no const dentro de un método const.

Muestra tu código actualizado por favor.
 

Aparentemente, resolví el problema utilizando el operador "&" en la función Compare() para obtener el valor de "this":


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;
}


Finalmente obtuve el valor que esperaba.

 

Puedes eliminar thisObject y sustituirlo por "this" en la comparación.

Pero, ¿por qué no usas la funcionalidad "operador" en lugar de una función "Comparar"? Hace que el código sea más fácil de leer después.

 
Doerk Hilger:

Puedes eliminar thisObject y sustituirlo por "this" en la comparación.

Pero, ¿por qué no usas la funcionalidad "operador" en lugar de una función "Comparar"? Hace que el código sea más fácil de leer después.


Porque es un método polimórfico de la clase base CObject y tiene que ser sobrescrito para implementar la ordenación y la búsqueda en las clases Collection, CArrayObj y CList.

 
Gustavo Hennemann:

Aparentemente, resolví el problema utilizando el operador "&" en la función Compare() para obtener el valor de "this":



Finalmente obtuve el valor que esperaba.


No estoy seguro de lo que esperas conseguir con esta lógica. Lo normal es que sólo quieras comparar los mismos elementos para ordenar y buscar.

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

No estoy seguro de lo que espera conseguir con esta lógica. Típicamente querrías sólo comparar los mismos elementos para ordenar y buscar.

Exactamente, ahora está ordenando, antes no podía hacer la comparación, me salían erros y errores. Ahora ya funciona.

Este enfoque no es obvio y no está en ningún documento, tuve que hacer muchas pruebas y "ensayo y error" hasta conseguirlo. Espero que otros puedan disfrutar de la solución.

 
Gustavo Hennemann:

Exacto, ahora está ordenando, antes no podía hacer la comparación, me salían erros y errores y errores. Ahora ya funciona.

Este enfoque no es obvio y no está en ningún documento, tuve que hacer muchas pruebas y "ensayo y error" hasta conseguirlo. Espero que otros puedan disfrutar de la solución.


Sólo tengo curiosidad por saber por qué necesitaba el operador "&" en lafunción Compare() para obtener el valor de "this".


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:

Sólo tengo curiosidad por saber por qué necesitabas el operador "&" en lafunción Compare() para obtener el valor de "this".


Es el equivalente a usar GetPointer(this)
 
nicholishen:
Es el equivalente a usar GetPointer(this)

Bueno, eso no responde a la pregunta "por qué". No había ninguna razón para revelar el puntero a sí mismo.

 
Ex Ovo Omnia:

Bueno, eso no responde a la pregunta "por qué". No había ninguna razón para revelar el puntero a sí mismo.

No, definitivamente no en este ejemplo, ya que es una extracción redundante, pero digamos que estabas pasando esto a un método que sólo aceptaba un puntero, entonces tendrías que usarlo... method(&this)