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.
Usunąłem tag 'java', ponieważ ekspert Java nie może pomóc w udzieleniu odpowiedzi na to pytanie. –
Dawno nie pisałem żadnego C++, ale myślę, że będziesz musiał przeciążyć operatora ==. – ChadNC
Zakładki fałszowały twoje formatowanie. Więc naprawiłem to dla ciebie. – Mysticial