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

C++ 运算符重载:无法添加两个指针,c++,pointers,reference,operator-overloading,fractions,C++,Pointers,Reference,Operator Overloading,Fractions,我创建了一个分数类,该类具有成员函数,可以在两个分数对象之间进行加、减、乘和除,以及所需的默认构造函数和复制构造函数 对于这个问题,我必须使用指针不能使用向量!因为只有用户选择创建分数对象时,才能创建分数对象。简而言之,指针声明和新初始化在不同的范围内 我还试图重载操作符=、操作符+、操作符-、操作符*、操作符/以接受如下内容 Fraction* fr1 = new Fraction(1,2); Fraction* fr2 = new Fraction(3,4); Fraction* fr3

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

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

我还试图重载操作符=、操作符+、操作符-、操作符*、操作符/以接受如下内容

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;
    }
我不断收到错误“+”:无法添加两个指针,这很可能意味着重载运算符+未正确写入和/或重载赋值运算符。
我需要做什么来更正此问题?同样,我的讲师希望我使用指针,不希望我通过或返回任何内容的副本。我需要通过引用或指针传递?类似的事情?

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

Fraction *f, *g; // allocated with new
f->operator+(*g); /// Urgh!
或者,几乎同样丑陋

Fraction *f, *g;
(*f) + (*g);
一个简单的方法是声明三个新的引用变量,如下所示:

Fraction& f1 = *pfr1;
Fraction& f2 = *pfr2;
Fraction& f3 = *ptr3;
Fraction * operator+(const Fraction * lhs, const Fraction * rhs)
{
    ...
}

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

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

Fraction& f1 = *pfr1;
Fraction& f2 = *pfr2;
Fraction& f3 = *ptr3;
Fraction * operator+(const Fraction * lhs, const Fraction * rhs)
{
    ...
}
但是,此函数签名不合法。不能编写只接受指针参数的运算符重载。至少有一个参数必须是用户定义的类型,即类、结构。这就是语言的规则


和你的老师谈谈,明确你需要做什么。

这是一个很棒的主意!我试试看。谢谢另一个错误仍然存在。这一次,重载的赋值运算符=不起作用。不用担心!我做了一件非常愚蠢的事。谢谢你的帮助@杰西戈德:没有。您可以从一个指针减去另一个指针。也可以向指针添加整数,或从指针中减去整数。但是您不能添加两个指针。@BenjaminLindley:是的,谢谢您的更正。@user2967424:左手参数的类型是隐式的,正确。然而,我不知道如何从这个事实中得出结论,使用对象的指针是绝对正确的。成员二进制运算符的左侧参数的类型隐式地是该运算符所属类的对象。因此,在您的例子中,它是一个分数对象,而不是指向分数对象的指针。