2012-12-18 199 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); 
}