Question

J'ai une classe d'URL qui surcharge les opérateurs ==, < ;, > ;, et! = pour une simple comparaison. La classe d'URL a un membre de données de chaîne et certaines fonctions pour agir sur la chaîne. Les opérateurs fonctionnent correctement lorsqu'ils sont testés avec la classe d'URL.

J'ai aussi une classe Page qui a un membre de données URL. J'essaie de surcharger les mêmes opérateurs de la classe Page. L'égalité dans la classe Page est basée sur l'égalité de leurs URL respectives. J'utilise donc les opérateurs booléens de la classe URL pour comparer des pages. Cela crée des erreurs de compilateur que je ne peux pas comprendre. Code pour les opérateurs d'URL:

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

Code pour les opérateurs de page:

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

Ceci produit des erreurs comme celle-ci:

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 que c’est quelque chose de stupide que j’oublie. Voulez-vous me prouver le droit?

modifier: L'exactitude des constations m'a mordu dans le cul. Merci pour l'aide.

Était-ce utile?

La solution

Cela aurait dû être:

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

Et de la même manière pour les autres opérateurs.

Si vous rencontrez toujours des erreurs de compilation, vous n'avez peut-être pas également fait GetURL() const:

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

Autres conseils

Je voudrais également souligner que des méthodes (à savoir l'interface publique) existent pour protéger les entités externes des modifications apportées aux détails de la mise en œuvre. De plus, le fait qu'une classe soit automatiquement un ami de lui-même (pour la même raison) et qu'ainsi, l'accès aux membres de l'autre objet est correct.

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

Peut être écrit comme suit:

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

Dans mon esprit, cela rend le code plus clair (mais c’est encore une opinion, vos goûts peuvent varier)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top