2012-06-11 23 views
7

Gibt es etwas wie Java equals()? Um zu vergleichen, ob das Objekt vom selben Typ ist?Gibt es in C++ ein Äquivalent zur Java-Methode equals?

public boolean equals(Object obj) { 
    if (obj == null || !(obj instanceof ViewMode)) { 
     return false; 
    } 

    ViewMode dm = (ViewMode) obj; 
    return dm.width == w 
     && dm.h == h 
     && dm.b == b 
     && dm.f == f; 
} 

public int hashCode() { 
    return w^h^f^b ; 
} 
+3

Ich habe das 'java'-Tag entfernt, weil ein Java-Experte nicht helfen kann, diese Frage zu beantworten. –

+2

Es ist schon lange her, dass ich C++ geschrieben habe, aber ich denke, dass Sie den Operator == überladen müssen. – ChadNC

+0

Die Tabs haben Ihre Formatierung durcheinander gebracht. Also habe ich es für dich repariert. – Mysticial

Antwort

12

Nein. C++ hat kein globales Typmodell wie Java. Es gibt keinen Typ Object, von dem alle anderen Typen erben, daher gibt es keine Methoden (wie equals), die für alle Klassen definiert sind.

C++ bietet ein Framework zum Erstellen eines Modellmodells mit einer universellen Vergleichsoperation: operator ==. Es liegt an Ihnen, alle Implementierungen in allen Klassen so zu erstellen, dass sie korrekt interagieren. Aber es gibt keine Standardimplementierung, die mit Object.equals vergleichbar ist.

+2

Als eine weitere Anmerkung, erfordert Idiomatic C++ * in der Regel * nicht so viel Downcasting von einer Basisklasse wie Java. –

+1

"Es gibt keine Methoden (wie equals), die für alle Klassen definiert sind" - Sie könnten für unäre 'operator &' ("address-of") für alles definieren, aber das ist nur Pedanterie ;-) –

5

Sie können die operator== in Ihrer Klasse definieren.

0

Möglicherweise können Sie dazu den Operator typeid verwenden.

13

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.

+0

Guter Anruf Das hatte ich vergessen. –

Verwandte Themen