2009-09-14 6 views
4

Je voudrais comparer deux objets à travers leurs adresses. J'ai essayé de surcharger l'opérateur et ça ne semble pas fonctionner pour les pointeurs, mais ça marche pour les objets eux-mêmes. Voici le code correspondant:C++: surcharge de <pour des pointeurs vers des objets

class C { 
     public: 
       int x; 
}; 
. 
. 
. 
bool operator <(C *ptr_c1, C *ptr_c2) 
{ 
     return ((*ptr_c1).x < (*ptr_c2).x); 
} 
+0

@snjv: Voulez-vous dire que, pointeurs donné à 'C' que vous voulez les comparer, mais pour que la comparaison soit basée sur certains membres, comme' x'? – quamrana

+0

oui, c'est exactement besoin! –

Répondre

4

Un pointeur est un type C++ natif et vous ne pouvez surcharger les opérateurs pour les types définis par l'utilisateur (à savoir les classes). Si cela était possible, cela violerait le principe de la «moindre surprise» et provoquerait un comportement différent des comparaisons de pointeurs selon que votre définition n'était pas visible. Ce serait probablement très déroutant. Notez que vous pouvez remplacer la valeur par défaut std::less dans la plupart des conteneurs associatifs et des algorithmes nécessitant un ordre partiel.

+0

Pourquoi le changement de comportement est-il moins "surprenant" lorsque vous utilisez la spécialisation de modèle de "std :: less"? – mastov

+0

@mastov: Il n'est pas légal de spécialiser 'std :: less' pour les pointeurs bruts. Utiliser un autre objet fonction pour remplacer _std :: less' devrait être moins surprenant car il doit être explicitement spécifié. –

+0

Bien sûr, quelque chose qui remplace 'std :: less' qui n'est * pas * une spécialisation serait moins surprenant (puisqu'il faut l'utiliser explicitement), j'ai mal interprété votre réponse, j'ai compris que vous vouliez * spécialiser * std: : moins » Quoi qu'il en soit, je n'ai pas trouvé de référence pour la spécialisation de 'std :: less' pour les pointeurs bruts étant illégaux. Qui/qu'est-ce qui le dit? – mastov

1
if(*obj1 < *obj2) { /* this should use the overloaded operator. */ } 
+0

J'ai les pointeurs dans une priority_queue qui à son tour utilise '<'. –

7

J'ai essayé de surcharger l'opérateur et il ne semble pas fonctionner pour les pointeurs,

Correct.

mais fonctionne pour les objets eux-mêmes.

Correct.

Alors, quelle est la question?

Voulez-vous utiliser des pointeurs dans un conteneur trié?

#include <iostream> 
#include <set> 

struct X 
{ 
    int x; 
}; 

struct XPTest 
{ 
    bool operator()(X* const& lhs,X* const& rhs) 
    { 
     return lhs->x < rhs->x; 
    } 
}; 

int main() 
{ 
    X  x1; x1.x = 5; 
    X  x2; x2.x = 6; 

    std::set<X*,XPTest> plop; 

    plop.insert(&x1); 
    plop.insert(&x2); 
} 
+0

Pourquoi devons-nous utiliser une nouvelle structure? Cant nous utilisons la structure X? – Ediolot

+1

@Ediolot: Vous pourriez. Mais ce serait une mauvaise idée. La seconde classe passée à 'std :: set' est supposée être une classe de comparaison. Mettre le test dans 'X', puis déclarer' std :: set 'ne semble pas très logique. –

Questions connexes