Für die idiomatische Äquivalent Ihres Beispiel würden Sie operator==
wie folgt definieren:
friend bool operator==(const ViewMode &lhs, const ViewMode &rhs) {
return (lhs.w == rhs.w) && the rest;
}
friend bool operator!=(const ViewMode &lhs, const ViewMode &rhs) {
return !(lhs == rhs);
}
In C++ Sie nicht schreiben normalerweise eine Funktion ViewMode
Objekte zu ermöglichen, mit etwas verglichen werden, die gar nichts hat mit ViewMode
zu tun. Ich nehme an, dass, wenn Sie wirklich, dass ein Vergleich wollte false zurück, anstatt zu kompilieren weigern, dann könnten Sie ein paar Template Operatoren hinzufügen (als freie Funktionen, außerhalb der Klasse):
template <typename T>
bool operator==(const ViewMode &, const T&) {
return false;
}
template <typename T>
bool operator==(const T &, const ViewMode&) {
return false;
}
aber ich wirklich don‘ Ich empfehle es. Dieses Java-Idiom gilt nicht für C++, denn in C++ sollte man eigentlich nie ein Objekt haben, aber keine Ahnung von seinem Typ haben.
Wenn Sie möchten, dass Ihre equals-Funktion virtuell ist, dann ist es wahrscheinlich am besten, eine equals()
virtuelle Funktion zu schreiben, anstatt operator==
dafür zu verwenden. Sie würden es schreiben, um einen const ViewObject &
als Parameter zu nehmen, also keine Notwendigkeit für irgendein Äquivalent zum instanceof
Scheck. Das ist auch gut so, weil C++ keine Möglichkeit hat, ein Objekt eines völlig unbekannten Typs zu nehmen und zu testen, ob es sich um eine Instanz eines bestimmten Typs handelt.
Sie benötigen selten eine polymorphe equals-Funktion in C++, aber wenn Sie sie beispielsweise in std::unordered_map
verwenden würden, würden Sie die zusätzlichen Vorlagenparameter für die unordered_map
angeben. Geben Sie ihm eine Gleichheitsvergleichsfunktion, die zwei Zeiger und Aufrufe equals
auf der einen oder anderen nimmt, und eine Hash-Funktion, die etwas Sinnvolles tut.
Ich habe das 'java'-Tag entfernt, weil ein Java-Experte nicht helfen kann, diese Frage zu beantworten. –
Es ist schon lange her, dass ich C++ geschrieben habe, aber ich denke, dass Sie den Operator == überladen müssen. – ChadNC
Die Tabs haben Ihre Formatierung durcheinander gebracht. Also habe ich es für dich repariert. – Mysticial