Domanda

Ho una classe URL che sovraccarica gli operatori ==, < ;, > ;, e! = per un semplice confronto. La classe URL ha un membro di dati stringa e alcune funzioni per agire sulla stringa. Gli operatori funzionano bene quando testati con la classe URL.

Ho anche una classe Page con un membro di dati URL. Sto cercando di sovraccaricare gli stessi operatori nella classe Page. L'uguaglianza nella classe Page si basa sull'uguaglianza dei rispettivi URL, quindi uso gli operatori booleani della classe URL per confrontare le pagine. Questo crea alcuni errori del compilatore che non riesco a capire. Codice per operatori URL:

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

Codice per operatori di pagina:

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

Questo produce errori in questo modo:

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

Prevedo che sia qualcosa di stupido che sto dimenticando. Mi dimostrerai giusto?

modifica: la costante correttezza mi ha morso nel sedere. Grazie per l'aiuto.

È stato utile?

Soluzione

Avrebbe dovuto essere:

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

E analogamente per gli altri operatori.

Se ricevi ancora errori del compilatore, forse non hai fatto anche GetURL() const:

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

Altri suggerimenti

Vorrei anche sottolineare che i metodi (cioè l'interfaccia pubblica) sono lì per proteggere le entità esterne da cambiamenti nei dettagli di implementazione. Inoltre, una classe è automaticamente amica di se stessa (per lo stesso motivo) e quindi è sufficiente accedere ai membri dell'altro oggetto.

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

Può essere scritto come:

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

Nella mia mente questo rende il codice più chiaro (ma anche questa è un'opinione che i tuoi gusti possono variare)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top