运算符重载:不能添加两个指针

Operator overloading : cannot add two pointers

本文关键字:两个 指针 重载 不能 添加 运算符      更新时间:2023-10-16
我创建了一个 Fraction 类,

该类具有成员函数,用于在两个 Fraction 对象之间加、减、乘和除以及所需的默认和复制构造函数。

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

我也在尝试重载运算符=、运算符+、运算符-、运算符*和运算符/以接受如下所示的内容。

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

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

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

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

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

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

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

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