运算符重载:无法添加两个指针

时间:2013-11-08 03:17:38

标签: c++ pointers reference operator-overloading fractions

我创建了一个Fraction类,它具有成员函数,可以在两个Fraction Objects和所需的默认和复制构造函数之间进行加,减,乘和除。

对于这个问题,我必须使用指针(不能使用向量!),因为只有在用户选择时才能创建Fraction对象。简而言之,指针声明和新初始化都在不同的范围内。

我也试图重载operator =,operator +,operator-,operator *和operator /来接受类似下面的内容。

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

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

Fraction* fr3 = new Fraction();

fr3 = fr1 + fr2;

我当前重载的operator = member函数如下所示:

    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;
    }

我不断收到错误'+':无法添加两个指针,这很可能意味着我的重载运算符+未正确写入(和/或我的重载赋值运算符)。 我需要做些什么才能纠正这个问题?同样,我的导师希望我使用指针,并且不希望我传递或返回任何东西的副本。我要么通过引用传递(或指针?类似的事情?)。

2 个答案:

答案 0 :(得分:0)

正如您所发现的,尝试在指针上使用算术运算符将导致编译器尝试执行指针运算。要在指针上调用自己的重载操作符,可以执行

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原始指针!

答案 1 :(得分:0)

当您将二元运算符(例如operator+)作为成员函数重载时,左侧参数需要是您为运算符重载的类的对象(而不是指针)。如果你想以其他方式做,你需要做一个自由函数,拿两个参数,如下:

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

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

与您的老师交谈并澄清您需要做什么。