Como substituir a comparação() em CObject para que a classificação CList() funcione? - página 3

 
Gustavo Hennemann:

Oi @Alain Verleyen,

Mudei o método getPrice(), inseri usando CopyClose() Estou usando CopyBuffer(). Isto não muda o objetivo principal.

Portanto, se eu usar a palavra-chave "const" no método getPrice(), um erro getPrice(): "'CopyBuffer' - nenhuma das sobrecargas pode ser aplicada à chamada de função". Acho que isto ocorre porque CopyBuffer não é um método const, e não é possível chamar o método non const dentro de um método const.

Mostre seu código atualizado, por favor.
 

Aparentemente, eu resolvi o problema usando o operador "&" na função Comparar() para obter o valor de "isto":


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 consegui o valor que estava esperando.

 

Você pode deixar esteObjeto e substituí-lo por "isto" na comparação.

Mas, por que você não usa a funcionalidade "operador" em vez de uma função "Comparar"? Torna o código mais fácil de ler mais tarde.

 
Doerk Hilger:

Você pode deixar esteObjeto e substituí-lo por "isto" na comparação.

Mas, por que você não usa a funcionalidade "operador" em vez de uma função "Comparar"? Torna o código mais fácil de ler mais tarde.


Porque é um método polimórfico da classe base CObject e tem que ser substituído para implementar a classificação e a busca nas classes Collection, CArrayObj e CList.

 
Gustavo Hennemann:

Aparentemente, eu resolvi o problema usando o operador "&" na função Comparar() para obter o valor de "isto":



Finalmente consegui o valor que estava esperando.


Não tenho certeza do que você espera alcançar com esta lógica. Normalmente, você só gostaria de comparar os mesmos elementos para classificar e pesquisar.

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

Não tenho certeza do que você espera alcançar com esta lógica. Normalmente, você só gostaria de comparar os mesmos elementos para classificar e pesquisar.

Exatamente, agora é a classificação, antes que eu não pudesse fazer a comparação, eu estava recebendo erros e erros e erros. Agora está funcionando.

Esta abordagem não é óbvia e não está em nenhum documento, eu tive que fazer muitos testes e "tentativas e erros" até conseguir isto. Espero que outros possam aproveitar a solução.

 
Gustavo Hennemann:

Exatamente, agora está ordenando, antes que eu não pudesse fazer a comparação, eu estava recebendo erros e erros e erros. Agora está funcionando.

Esta abordagem não é óbvia e não está em nenhum documento, eu tive que fazer muitos testes e "tentativas e erros" até conseguir isto. Espero que outros possam aproveitar a solução.


Estou apenas curioso por que você precisou do operador "&" nafunção Comparar() para obter o valor de "isto".


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:

Estou apenas curioso por que você precisava do operador "&" nafunção Comparar() para obter o valor de "isto".


É o equivalente a usar GetPointer(isto)
 
nicholishen:
É o equivalente a usar o GetPointer(isto)

Bem, isso não responde à pergunta "por que". Não havia motivo para revelar o ponteiro a si mesmo.

 
Ex Ovo Omnia:

Bem, isso não responde à pergunta "por que". Não havia motivo para revelar o ponteiro a si mesmo.

Não, definitivamente não neste exemplo, pois é uma extração redundante, mas digamos que você estava passando isto para um método que só aceitava um ponteiro, então você precisaria usá-lo... método(&isto)
Razão: