Frage

ich eine URL Klasse, die die == Überlastungen, <,>, und! = Betreiber für einen einfachen Vergleich. Die URL-Klasse hat ein String-Datenelement und einige Funktionen auf der Saite zu handeln. Die Betreiber gut funktionieren, wenn sie mit der URL-Klasse getestet.

Ich habe auch eine Seite Klasse, die ein URL-Datenelement. Ich versuche, die gleichen Operatoren in der Page-Klasse zu überlasten. Gleichheit in der Page-Klasse wird auf Gleichheit ihrer jeweiligen URLs basiert, so dass ich die URL-Klasse Booleschen Operatoren in Seiten zu vergleichen. Dies schafft einige Compiler-Fehler, die ich kann nicht herausfinden. Code für URL-Operatoren:

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

-Code für Seitenbetreiber:

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

Dies erzeugt Fehler wie folgt:

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

Ich sage voraus, dass es etwas dumm, dass ich vergessen habe. Werden Sie beweisen mir?

Bearbeiten Const Korrektheit hat mich in den Hintern gebissen. Danke für die Hilfe.

War es hilfreich?

Lösung

Es sollte gewesen sein:

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

Und analog für die anderen Betreiber.

Wenn Sie noch Compiler-Fehler erhalten, vielleicht haben Sie nicht gemacht GetURL() const auch:

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

Andere Tipps

Ich möchte auch darauf hinweisen, dass Methoden (dh die öffentliche Schnittstelle) sind externe Einheiten von Änderungen in den Details der Implementierung zu schützen. automatisch ein Freund von mir auch, dass eine Klasse (aus dem gleichen Grunde) ist und somit nur die Mitglieder des anderen Objekts ist der Zugriff auf OK.

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

Kann wie geschrieben werden:

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

In meinem Kopf macht dies den Code klarer (aber auch dies ist eine Meinung Ihres Geschmack können variieren)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top