2012-12-18 119 views
3

我的代碼出現了什麼問題?請有人投擲一些光。謝謝你的時間 !C++操作符重載,

#include<iostream.h> 
     using namespace std; 

    struct mydata{ 
     int mx; 
     mydata(int x = 0){} 
     mydata operator+(const mydata& rhs){ 

       mydata temp(rhs); 
       return temp; 
     } 
     operator int() const{ return mx; } 
     operator double() const{ return mx; } 
}; 


int main(){ 
     mydata d; 
     mydata r = d + 5; // L1 
     5 + d; // L2 
     d + d; // L3 
} 
+1

什麼是錯誤? –

+1

你能刪除行號嗎?它阻止人們編寫你的例子。不錯的示例代碼! – Pubby

+0

mydata(int x = 0)-constructor do mx = x; ? – deo

回答

2

問題(說的comment)是編譯器不知道要執行哪個+

(double)d + 5 

(int)d + 5 

爲了解決這個ambiguoity,你應該指出類型轉換,或者用命名函數替換這些運算符之一:

operator int() const{ return mx; } 
    operator double() const{ return mx; } 

如果您想改用d + MYDATA(5)你應該寫這樣,因爲上述變異更容易被應用

3

首先,你還沒有說是什麼問題,但想必你想要一個operator+,總結2個mydata對象的mx值:

mydata operator+(const mydata& rhs){ 
     return mydata (mx + rhs.mx); 
} 

接下來,我會建議使這一非成員函數,因此LHS和RHS以同樣的方式得到處理,固定在L2問題:

mydata operator+(const mydata& lhs, const mydata& rhs){ 
     return mydata (lhs.mx + rhs.mx); 
} 

翅盟友,你將有一個模糊的超載剩餘,因爲編譯器不能決定是使用內置的operator+(int,int)還是你自己的operator+(const mydata&, const mydata&)。您可以通過刪除演員操作員int()double()來解決此問題。

查看演示here

+1

我只能批准刪除演員操作員:6 –

0

你不能做5 + d。 5不能像這樣轉換爲類對象。爲此,您需要從類方法中獲取operator +定義。 (在我的知識中最好是朋友)。

+0

這就是@juanchopanza的答案中暗示的最小代碼示例 – fayyazkl

+0

是的,我注意到了。後來編輯了這一點。我第一次看到它不在那裏。 –

+0

謝謝大家的迴應! – sree

1

你可以提供一些非成員operator +,使operator+不同的數據類型:

mydata operator+(const mydata& lhs, const mydata& rhs){ 
     return mydata (lhs.mx + rhs.mx); 
} 
mydata operator+(int mx, const mydata& rhs){ 
     return mydata (rhs.mx+mx); 
} 

mydata operator+(const mydata& lhs, int mx){ 
     return mydata(lhs.mx+mx); 
}