2012-09-04 24 views
3

說我有一個類,我重載操作==這樣:C++:超載=當==重載

Class A { 
    ... 
    public: 
    bool operator== (const A &rhs) const; 
    ... 
}; 

... 

bool A::operator== (const A &rhs) const { 
    .. 
    return isEqual; 
} 

我已經有運營商==返回正確的布爾值。現在我想把它延伸到簡單的相反(!=)。我想打電話給重載==操作和返回相反,即自然

bool A::operator!= (const A &rhs) const { 
    return !(this == A); 
} 

這是可能的東西嗎?我知道this不起作用,但它舉例說明了我想要的。我想只保留一個參數:rhs。任何幫助將不勝感激,因爲我經過多次搜索嘗試後都無法提供答案。

回答

9

你幾乎擁有了:

bool A::operator!= (const A &rhs) const { 
    return !(*this == rhs); 
} 

注意this指針,而不是對象。你需要解除引用。在相關的說明中,通常更好的做法是將大多數二元運算符實現爲自由函數而不是成員函數。

4

你不必在個人(每班)的基礎上做。

標準庫已經提供了支持這種做法,通過聲明爲運營商!=><=>=,這依賴於用戶爲運營商提供==<「默認」模板實現。這些聲明位於頭<utility>並封裝在命名空間std::rel_ops

由於這些實現,在命名空間std::rel_ops宣佈,他們不會因名稱查找默認發現。如果你想「激活」這些定義在你的程序中,執行

#include <utility> 
using namespace std::rel_ops; 

這一點,例如,將自動從您的實現操作==的在翻譯單元的所有類派生運營商!=。您仍然可以通過爲某些特定類提供運算符!=的顯式實現來覆蓋該機制。

+0

的(使用'使用命名空間std :: rel_ops;')下跌,另一方面是定義所有的運營商''==現在也有一個隱含的'='即使有原筆者特地沒有!創建一個(如果他們沒有創建一個,他們可能有一個很好的理由(特別是因爲它很容易))。 –

+0

優於'使用namespace',您可以添加使用'::性病:: rel_ops ::運算符=!;使用:: std :: rel_ops :: operator>; ...'來爲所定義類型的名稱空間中所需的運算符。這將使ADL能夠找到它,但它仍然存在Loki提到的問題:你不能通過類來控制,只能通過命名空間來控制。遺憾的是,標準沒有在名稱空間中添加標籤類型,因爲這會更簡單:class MyType::: std :: rel_ops :: tag {};'會將所有模板都帶入'MyType'不會干擾命名空間中的其他類型。 –

+0

(使用的標籤類型,以使在一個命名空間模板運營商的選擇是由迪特馬爾庫爾建議的,儘管這是預C++ 11'rel_ops')。另一種(不使用'的std :: rel_ops'我有打過去被濫用CRTP:!'模板結構可比{朋友布爾運算符=(T常量&A,T常量和b){返回(一== b );}; friend bool operator>(T const&a,T const&b){return b {};/*在一個單獨的命名空間中再次提供op ==,op <* /',ADL將通過查找基類來找到它... –