2009-10-24 9 views
2

J'ai une classe d'URL qui surcharge les ==, <, >, et les opérateurs! = Pour une comparaison simple. La classe d'URL a un membre de données de chaîne et quelques fonctions pour agir sur la chaîne. Les opérateurs fonctionnent correctement lorsqu'ils sont testés avec la classe d'URL. J'ai également une classe Page qui a un membre de données d'URL. J'essaye de surcharger les mêmes opérateurs dans la classe Page. L'égalité dans la classe Page est basée sur l'égalité de leurs URL respectives, donc j'utilise les opérateurs booléens de la classe URL dans la comparaison des pages. Cela crée des erreurs de compilation que je ne peux pas comprendre. Code pour les opérateurs d'URL:Erreur de compilation lors de l'utilisation d'une surcharge d'opérateur imbriquée en C++

bool URL::operator ==(URL & u) const { 
    //url is the string instance variable 
    return url == u.GetURL(); 
} 
Code

pour les opérateurs Page:

bool Page::operator ==(Page & p) const { 
    //url is the URL instance variable of the Page class 
    return url == p.GetURL(); 
} 

Cela produit des erreurs comme ceci:

src/Page.cpp: In member function ‘bool Page::operator==(Page&) const’: 
src/Page.cpp:21: error: no match for ‘operator==’ in ‘((const Page*)this)->Page::url == Page::GetURL()()’ 
inc/URL.h:118: note: candidates are: bool URL::operator==(URL&) const 

Je prédis qu'il est quelque chose de stupide que j'oubliais. Voulez-vous me prouver le droit?

éditer: Const correcte a mordu dans le cul. Merci pour l'aide.

+0

Lorsque vous écrivez des classes C++ dont instance sont destiné à être utilisé comme des valeurs à manipuler et à comparer, la constabilité est très importante. Non seulement cela vous aide à éviter les erreurs du compilateur, mais il permet aussi au compilateur d'effectuer des optimisations agressives, comme de ne pas charger les variables plus d'une fois dans les registres, etc. – pyon

Répondre

6

Il aurait dû être:

bool URL::operator ==(const URL & u) const { 
    //url is the string instance variable 
    return url == u.GetURL(); 
} 

Et pour les autres analogue opérateurs.

Si vous obtenez toujours des erreurs du compilateur, peut-être vous n'avez pas fait GetURL() const ainsi:

std:string URL::GetURL() const { 
    // whatever... 
} 
+0

Merveilleux, merci. J'ai dû faire à la fois la classe GetURL() et la classe URL GetURL() const fonctions. Dang cerveau. – jergason

1

Je voudrais également souligner que les méthodes (à savoir l'interface publique) sont là pour protéger les entités externes des changements dans les détails de mise en œuvre. De plus, une classe est automatiquement un ami de lui-même (pour la même raison) et donc accéder aux membres de l'autre objet est OK.

bool URL::operator ==(URL & u) const { 
    //url is the string instance variable 
    return url == u.GetURL(); 
} 

peut être écrit comme:

bool URL::operator ==(URL & rhs) const 
{ 
    return url == rhs.url; // No need to use GetURL() 
} 

Dans mon esprit, ce qui rend le code plus clair (mais cela est encore une fois un avis vos goûts peuvent varier)

+0

D'accord. 'GetURL()' est destiné à être utilisé en dehors de la classe. – pyon

+0

Merci, ça le rend plus propre. – jergason

+0

Je suis toujours allé dans l'autre sens: 'return GetURL() == rhs.GetURL();'. Fonction de réutilisation. – GManNickG