运算符重载:不能添加两个指针(Operator overloading : cannot add t

2019-10-18 22:55发布

我创建了一个分数类,它是有成员函数进行加,减,乘,并与所需的默认沿着两个分数之间的对象划分拷贝构造函数。

对于这个问题,我必须使用指针(不能使用矢量!),因为如果用户选择该分数对象只能被创建。 总之,指针声明和新的初始化是差范围。

我想也重载运算符=,+运营商,运营商,运营商*和运营商/接受类似于下面的东西。

Fraction* fr1 = new Fraction(1,2);

Fraction* fr2 = new Fraction(3,4);

Fraction* fr3 = new Fraction();

fr3 = fr1 + fr2;

我现在的重载运算符=成员函数看起来就像这样:

    Fraction* Fraction::operator=(const Fraction*& fr) {


      num = fr->num;

      denom = fr->denom;

      return this; 
    }

    Fraction* Fraction::operator+(const Fraction*& fr) const {

      int gcd = gcdRecurEuclid(num * fr->denom + denom * fr->num, denom * fr->denom);

      Fraction* temp;

      temp = new Fraction((num * fr->denom + fr->num * denom) / gcd, 

                          (denom * fr->denom) / gcd);

      return temp;
    }

我不断收到错误“+”:不能添加两个三分球,这很可能意味着我的重载操作符+不正确地写入(和/或我的重载的赋值运算符)。 我需要做什么做纠正呢? 同样,我的教练希望我的指针工作,并且不希望我传递或返回的任何副本。 我要么需要通过引用传递(或指针?类似的事情?)。

Answer 1:

正如你已经发现,试图用算术运算符上的指针会导致编译器试图做指针运算。 打电话给你自己的重载操作上的指针,你可以做

Fraction *f, *g; // allocated with new
f->operator+(*g); /// Urgh!

或者,几乎丑陋

Fraction *f, *g;
(*f) + (*g);

一个简单的方法,使这个更好一点是宣布三个新的引用变量是这样的:

Fraction& f1 = *pfr1;
Fraction& f2 = *pfr2;
Fraction& f3 = *ptr3;

pfrN s为指针,以你的分数。 现在,如果你使用的参考变量,你超载运营商将正确调用,而你并不需要把所有多余的星号。 引用会消失在范围结束,并可能在你的程序将不会使用任何额外的内存。 你仍然需要delete ,虽然原来的三分球!



Answer 2:

当重载二进制运算符,(如operator+ ),为成员函数,左手参数需要是你所过载操作的类的对象(未指针)。 如果你想要做一些其他的方式,你需要做它作为一个免费的功能,服用两个参数,就像这样:

Fraction * operator+(const Fraction * lhs, const Fraction * rhs)
{
    ...
}

但是, 这个功能的签名是不合法的 。 你不能写一个运算符重载这只需指针参数。 至少其中一个参数需要是一个用户定义的类型(即类,结构)。 这就是语言的只是规则。

谈谈你的老师并获得你需要做什么澄清。



文章来源: Operator overloading : cannot add two pointers