Come sovrascrivere Compare() in CObject in modo che CList sort() funzioni? - pagina 3

 
Gustavo Hennemann:

Ciao @Alain Verleyen,

Ho cambiato il metodo getPrice(), invece di usare CopyClose() sto usando CopyBuffer(). Questo non cambia l'obiettivo principale.

Quindi, se utilizzo la parola chiave "const" nel metodo getPrice(), ottengo l'errore: "'CopyBuffer' - nessuno degli overloads può essere applicato alla chiamata di funzione". Penso che questo accada perché CopyBuffer non è un metodo const, e non è possibile chiamare un metodo non const all'interno di un metodo const.

Mostra il tuo codice aggiornato per favore.
 

Apparentemente, ho risolto il problema usando l'operatore "&" nella funzione Compare() per ottenere il valore di "questo":


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 ho ottenuto il valore che mi aspettavo.

 

Potete abbandonare thisObject e sostituirlo con "this" nel confronto.

Ma perché non usi la funzionalità "operator" invece di una funzione "Compare"? Rende il codice più facile da leggere in seguito.

 
Doerk Hilger:

Potete abbandonare thisObject e sostituirlo con "this" nel confronto.

Ma perché non usi la funzionalità "operator" invece di una funzione "Compare"? Rende il codice più facile da leggere in seguito.


Perché è un metodo polimorfo della classe base CObject e deve essere sovrascritto per implementare l'ordinamento e la ricerca nelle classi Collection, CArrayObj e CList.

 
Gustavo Hennemann:

Apparentemente, ho risolto il problema usando l'operatore "&" nella funzione Compare() per ottenere il valore di "questo":



Alla fine ho ottenuto il valore che mi aspettavo.


Non sono sicuro di cosa speri di ottenere con questa logica. In genere si vorrebbe confrontare solo gli stessi elementi per l'ordinamento e la ricerca.

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

Non sono sicuro di cosa speri di ottenere con questa logica. In genere si vorrebbe confrontare solo gli stessi elementi per l'ordinamento e la ricerca.

Esattamente, ora è l'ordinamento, prima non potevo fare il confronto, ottenevo errori ed errori ed errori. Ora funziona.

Questo approccio non è ovvio e non è in nessun documento, ho dovuto fare un sacco di prove e "prove ed errori" fino ad ottenere questo. Spero che altri possano godere della soluzione.

 
Gustavo Hennemann:

Esattamente, ora sta ordinando, prima non potevo fare il confronto, ricevevo erre ed errori ed errori. Ora funziona.

Questo approccio non è ovvio e non è in nessun documento, ho dovuto fare un sacco di prove e "prove ed errori" fino ad ottenere questo. Spero che altri possano godere della soluzione.


Sono solo curioso di sapere perché avevi bisogno dell'operatore "&" nellafunzione Compare() per ottenere il valore di "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:

Sono solo curioso di sapere perché avete bisogno dell'operatore "&" nellafunzione Compare() per ottenere il valore di "this".


È l'equivalente di usare GetPointer(this)
 
nicholishen:
È l'equivalente di usare GetPointer(this)

Beh, questo non risponde alla domanda "perché". Non c'era motivo di rivelare il puntatore a self.

 
Ex Ovo Omnia:

Beh, questo non risponde alla domanda "perché". Non c'era motivo di rivelare il puntatore a self.

No, sicuramente non in questo esempio poiché è un'estrazione ridondante, ma diciamo che stavate passando questo a un metodo che accettava solo un puntatore allora avreste bisogno di usarlo... method(&this)
Motivazione: