2014-12-02 154 views
0

我試圖在C++中重載==運算符。比較同一類的兩個對象

#include <string> 

using namespace std; 

namespace date_independent 
{ 
    class clock 
    { 
     public: 
      int clockPair[2] = {0,0}; 
      operator string() const 
      { 
       string hourString; 
       string minString; 
       if(clockPair[0]<10) 
       { 
        hourString = "0"+to_string(clockPair[0]); 
       } 
       else 
       { 
        hourString = to_string(clockPair[0]); 
       } 
       if(clockPair[1]<10) 
       { 
        minString = "0"+to_string(clockPair[1]); 
       } 
       else 
       { 
        minString = to_string(clockPair[1]); 
       } 
       return hourString+":"+minString; 
      }; 
      bool operator ==(const clock&clockOne, const clock&clockTwo) const 
      { 
       return string(clockOne)==string(clockTwo); 
      }; 
    }; 
}; 

還有更多的代碼比我包括,但這是重要的部分。我需要它,以便==操作員可以比較類clock的兩個對象。例如,object1==object2。有沒有人可以幫助我?

+0

你的問題是什麼? – moooeeeep 2014-12-02 07:17:09

+0

相關:http://stackoverflow.com/q/4421706/1025391 – moooeeeep 2014-12-02 07:20:58

回答

5

==這樣的二元運算符可以作爲具有單個參數的成員函數重載(this是左邊的操作數,而參數是右邊的),或者作爲具有兩個參數的非成員函數兩個操作數的參數。

因此,無論

    (如果你一直在標題中定義的定義移動到一個源文件或聲明它 inline
  • 移動類的聲明之外的運營商申報;或
  • friend添加到定義中,以便它在周圍的名稱空間中聲明一個非成員;或
  • 從成員函數中刪除第一個參數,使用this來代替。

作爲會員,它看起來像

bool operator==(const const & clockTwo) const { 
    return string(*this) == string(clockTwo); 
} 

您也可能希望將兩個整數值直接比較進行保存字符串的代價。你也應該在函數和命名空間定義之後刪除流氓;,儘管大多數現代編譯器不應該反對它們的存在。

1

已經編寫了比較函數以取兩個clock對象並對它們進行比較,所以它應該是非成員函數(在類定義之後),而不是const限定符。

bool operator==(const clock& clockOne, const clock& clockTwo) 
{ 
    return string(clockOne) == string(clockTwo); 
} 

當你在類定義內的操作員,左手參數隱式地提供給你(這是*this),所以如果你想有實現它你需要的東西,如:

bool operator==(const clock& clockTwo) const 
{ 
    return string(*this) == string(clockTwo); 
} 

不過,這不是推薦==,如果你有說從其他類型的T一個隱含的構造函數,你將無法寫代碼翼my_t == my_clock與成員版本,除非T提供一個合適的比較運算符(clockstring)。非會員運營商提供更多對稱操作。

1

雖然你的問題措辭不佳,但我相信你會問爲什麼你定義的操作符不工作?

如果您將運算符定義爲類的成員,那麼它只需要一個參數。例如:

​​

當你定義操作爲免費功能(不作爲類的一部分),那麼您需要定義兩個參數:

class clock { 
    // ... class declaration ... 
}; 

bool operator ==(const clock& lhsClock, const clock& rhsClock) 
{ 
    return string(lhsClock) == string(rhsClock) 
} 

哪裏比較會看像這樣:

if (lhsClock == rhsClock) // ... do something ... 
1

重載可以在類定義內部或外部完成。如果你想在裏面做,該函數只收到一個參數。您應該將this與該參數進行比較。

bool operator ==(const clock&clockTwo) const 
{ 
    return string(*this)==string(clockTwo); 
} 

注意參數後const,這意味着你將不會改變this裏面的功能。另一方面,如果你想在類定義之外做它,它需要兩個參數,你應該比較它們。

bool operator ==(const clock&clockOne, const clock&clockTwo) 
{ 
    return string(clockOne)==string(clockTwo); 
} 

另外請注意,這將是更快地clockPair比較的對象,而不是使串並比較它們。