3

下面显示的代码有什么问题?请有人点亮。谢谢你的时间 !

    #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
}
4

4 回答 4

3

首先,您没有说明问题出在哪里,但大概您想要一个将两个对象的值operator+相加的值:mxmydata

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().

在此处查看演示。

于 2012-12-18T06:39:26.170 回答
2

问题(说明注释)是编译器不知道+您要执行哪个:

(double)d + 5

或者

(int)d + 5

为了解决这种歧义,您应该指出类型转换,或者用命名函数替换这些运算符之一:

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

如果你想改用 d + mydata(5) 你应该这样写,因为上述变体更有可能被应用

于 2012-12-18T06:48:35.630 回答
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);
}
于 2012-12-18T06:53:20.607 回答
0

你不能做 5 + d。5 不能像这样转换为类对象。为此,您需要从类方法中获取运算符 + 定义。(据我所知,最好是朋友)。

于 2012-12-18T06:45:08.343 回答