2012-06-11 15 views
7

Czy jest coś takiego jak Java equals()? Aby porównać, czy obiekt jest tego samego typu?Czy istnieje odpowiednik metody Java równa się w C++?

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

Usunąłem tag 'java', ponieważ ekspert Java nie może pomóc w udzieleniu odpowiedzi na to pytanie. –

+2

Dawno nie pisałem żadnego C++, ale myślę, że będziesz musiał przeciążyć operatora ==. – ChadNC

+0

Zakładki fałszowały twoje formatowanie. Więc naprawiłem to dla ciebie. – Mysticial

Odpowiedz

12

Nie. C++ nie ma globalnego modelu typu Java. Nie ma typu Object, z którego wszystkie inne typy dziedziczą, więc nie ma żadnych metod (takich jak equals), które są zdefiniowane dla wszystkich klas.

C++ zapewnia platformę do budowy modelu typu z operacją porównania uniwersalnego: operator ==. Od was zależy, czy opracujecie wszystkie implementacje tego we wszystkich waszych klasach, aby mogli poprawnie współdziałać. Ale nie ma domyślnej implementacji porównywalnej z Object.equals.

+2

Jako dalsza uwaga, idiomatic C++ * zazwyczaj * nie wymaga downcastingu z klasy bazowej tak bardzo jak Java. –

+1

"nie ma żadnych metod (takich jak równe), które są zdefiniowane dla wszystkich klas" - można zdefiniować dla wszystkich jednoargumentowy 'operator &' ("adres-z"), ale to tylko pedanteria ;-) –

5

Możesz zdefiniować operator== w swojej klasie.

0

Możliwe, że będziesz mógł użyć do tego operatora typeid.

13

Dla idiomatycznym równowartość swojej przykład, by zdefiniować operator== następująco:

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); 
} 

W C++ ty nie normalnie napisać funkcję, aby umożliwić ViewMode obiekty, które należy porównać z czymś, co w ogóle nie ma nic zrobić z ViewMode. Przypuszczam, że jeśli naprawdę chciał, że porównanie do return false zamiast odmowy do kompilacji, a następnie można dodać kilka operatorów szablonów (jak darmowe funkcje, poza klasą):

template <typename T> 
bool operator==(const ViewMode &, const T&) { 
    return false; 
} 

template <typename T> 
bool operator==(const T &, const ViewMode&) { 
    return false; 
} 

ale naprawdę don” t polecam to. Ten idiom Java nie ma zastosowania w C++, ponieważ w C++ nie powinno się nigdy mieć obiektu, ale nie mieć pojęcia o jego typie.

Jeśli chcesz, aby funkcja equals była wirtualna, najlepiej jest napisać funkcję wirtualną equals(), zamiast używać do niej funkcji operator==. Napiszesz go, aby jako parametr miał wartość const ViewObject &, więc nie potrzebujesz żadnego odpowiednika dla sprawdzenia instanceof. Co równie dobrze, ponieważ C++ nie ma możliwości pobrania obiektu całkowicie nieznanego typu i sprawdzenia, czy jest to instancja określonego typu.

Rzadko potrzeba funkcji polimorficznej równej w C++, ale jeśli używasz jej na przykład w std::unordered_map, musisz podać dodatkowe parametry szablonu do unordered_map. Daj mu funkcję porównywania równości, która pobiera dwa wskaźniki i wywołuje equals na jednej lub drugiej i funkcję skrótu, która robi coś sensownego.

+0

Dobre połączenie , Zapomniałem o tym. –

Powiązane problemy