1

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

对于这个问题,我必须使用指针(不能使用向量!)因为只有用户选择才能创建 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= 成员函数如下所示:

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

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

4

2 回答 2

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;

其中pfrNs 是指向分数的指针。现在,如果您使用引用变量,您的重载运算符将被正确调用,并且您不需要添加所有额外的星号。引用将在范围结束时消失,并且可能不会在您的程序中使用任何额外的内存。不过,您仍然需要delete原始指针!

于 2013-11-08T03:27:45.103 回答
0

当您将二元运算符(例如operator+)作为成员函数重载时,左侧参数必须是您为其重载运算符的类的对象(而不是指针)。如果您想以其他方式执行此操作,则需要将其作为自由函数执行,并带有两个参数,如下所示:

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

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

与您的老师交谈,了解您需要做什么。

于 2013-11-08T03:33:03.097 回答