2012-06-11 61 views
7

有沒有類似於Java的equals()?比較對象是否是同一類型?在C++中是否有等價的Java 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

我刪除了'java'標籤,因爲Java專家無法回答這個問題。 –

+2

自從我編寫C++以來已經很長時間了,但我認爲你必須重載==運算符。 – ChadNC

+0

這些標籤混淆了你的格式。所以我爲你修好了。 – Mysticial

回答

12

編號C++沒有Java這樣的全局類型模型。沒有其他所有類型繼承的Object類型,因此沒有爲所有類定義的方法(如equals)。

C++提供了一個構建具有通用比較操作的類型模型的框架:operator ==。您需要在所有類中構建所有這些實現,以便它們正確交互。但是沒有與Object.equals相媲美的默認實現。

+2

作爲進一步的說明,慣用的C++ *通常不需要像Java一樣從基類向下轉換。 –

+1

「沒有爲所有類定義的方法(如等於)」 - 您可以爲一行定義一元操作符&'(「地址 - 」),但這只是簡單而已;-) –

5

您可以在您的班級中定義operator==

0

您可能可以使用typeid這個操作符。

13

對於示例的習慣,你定會定義operator==如下:

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

在C++中,你通常不會寫一個函數允許ViewMode對象的東西,有什麼都沒有進行比較與ViewMode聯繫。我想,如果你真的想要一個比較返回false,而不是拒絕編譯,那麼你可以添加幾個模板運營商(如自由函數,類外):

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

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

,但我真不」 t推薦它。 Java成語不適用於C++,因爲在C++中,你幾乎不應該有對象,但不知道它的類型。

如果你想要你的等號功能是虛擬的,那麼最好寫一個equals()虛擬功能,而不是使用operator==。您將其編寫爲const ViewObject &作爲參數,因此不需要與instanceof檢查等效。這也是一樣,因爲C++沒有任何方法來獲取完全未知類型的對象並測試它是否是指定類型的實例。

您很少需要C++中的多態等效函數,但是如果您在std::unordered_map中使用了該函數,那麼您將爲unordered_map指定額外的模板參數。給它一個相等比較函數,它需要兩個指針,並在其中一個或另一個上調用equals,以及一個散列函數,它可以做一些明智的事情。

+0

良好的調用,我已經忘記了。 –

相關問題