Comment surcharger Compare() dans CObject pour que CList sort() fonctionne ? - page 3

 
Gustavo Hennemann:

Bonjour @Alain Verleyen,

J'ai changé la méthode getPrice(), au lieu d'utiliser CopyClose() j'utilise CopyBuffer(). Cela ne change pas l'objectif principal.

Donc, si j'utilise le mot clé "const" dans la méthode getPrice(), j'obtiens l'erreur : "'CopyBuffer' - aucune des surcharges ne peut être appliquée à l'appel de fonction". Je pense que cela se produit parce que CopyBuffer n'est pas une méthode const, et il n'est pas possible d'appeler une méthode non const à l'intérieur d'une méthode const.

Montrez votre code mis à jour s'il vous plaît.
 

Apparemment, j'ai résolu le problème en utilisant l'opérateur "&" dans la fonction Compare() pour obtenir la valeur 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;
}


J'ai finalement obtenu la valeur que j'attendais.

 

Vous pouvez abandonner thisObject et le remplacer par "this" dans la comparaison.

Mais, pourquoi ne pas utiliser la fonctionnalité "operator" au lieu d'une fonction "Compare" ? Cela rend le code plus facile à lire par la suite.

 
Doerk Hilger:

Vous pouvez abandonner thisObject et le remplacer par "this" dans la comparaison.

Mais, pourquoi ne pas utiliser la fonctionnalité "operator" au lieu d'une fonction "Compare" ? Cela rend le code plus facile à lire par la suite.


Parce que c'est une méthode polymorphe de la classe de base CObject et qu'elle doit être surchargée afin d'implémenter le tri et la recherche dans les classes Collection, CArrayObj et CList.

 
Gustavo Hennemann:

Apparemment, j'ai résolu le problème en utilisant l'opérateur "&" dans la fonction Compare() pour obtenir la valeur de "this" :



J'ai finalement obtenu la valeur que j'attendais.


Je ne suis pas sûr de ce que vous espérez obtenir avec cette logique. En général, vous ne voulez comparer que les mêmes éléments pour le tri et la recherche.

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

Je ne suis pas sûr de ce que vous espérez obtenir avec cette logique. Typiquement, vous voudriez seulement comparer les mêmes éléments pour le tri et la recherche.

Exactement, maintenant c'est le tri, avant cela je ne pouvais pas faire la comparaison, j'obtenais des erros et des erreurs et des erreurs. Maintenant ça marche.

Cette approche n'est pas évidente et ne se trouve dans aucun document, j'ai dû faire beaucoup de tests et de "tâtonnements" jusqu'à ce que j'y arrive. J'espère que d'autres pourront profiter de cette solution.

 
Gustavo Hennemann:

Exactement, maintenant ça trie, avant ça je ne pouvais pas faire la comparaison, j'obtenais des erros et des erreurs et des erreurs. Maintenant ça marche.

Cette approche n'est pas évidente et ne se trouve dans aucun document, j'ai dû faire beaucoup de tests et de "tâtonnements" jusqu'à ce que j'y arrive. J'espère que d'autres pourront profiter de cette solution.


Je suis simplement curieux de savoir pourquoi vous avez eu besoin de l'opérateur "&" dans lafonction Compare() pour obtenir la valeur 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:

Je suis simplement curieux de savoir pourquoi vous avez eu besoin de l'opérateur "&" dans lafonction Compare() pour obtenir la valeur de "this".


C'est l'équivalent de l'utilisation de GetPointer(this).
 
nicholishen:
C'est l'équivalent d'utiliser GetPointer(this)

Eh bien, cela ne répond pas à la question "pourquoi". Il n'y avait aucune raison de révéler le pointeur vers self.

 
Ex Ovo Omnia:

Eh bien, cela ne répond pas à la question "pourquoi". Il n'y avait aucune raison de révéler le pointeur à self.

Non, certainement pas dans cet exemple puisque c'est une extraction redondante, mais disons que vous passiez ceci à une méthode qui n'accepte qu'un pointeur, alors vous devriez l'utiliser... method(&this)
Raison: