运算符重载:不能添加两个指针
Operator overloading : cannot add two pointers
该类具有成员函数,用于在两个 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
原始指针!
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何将值添加到嵌套结构中,该结构在C++中有两个指针
- 比较两个指针时">="运算符的奇怪行为
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 错误 :"+" 无法添加两个指针
- 使与同一数组无关的两个指针减去未定义行为的基本原理是什么?
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 如何加入两个指针以将其串在一起并将其存储在数组或字符中
- 如何在多线程 c++ 17 程序中交换两个指针
- 这两个指针怎么能有相同的值
- 为什么两个指针都有相同的内存地址
- 两个指针之间的差异是合法的 c++17 常量表达式
- 为什么两个指向相同链接的两个指针在这里表现不同
- 这两个指针代码有什么区别
- 使用指针在Qt Creator UI中的其他两个指针之间切换
- 重写虚函数协变返回类型(两个指针)
- 想要一种在C++中交换两个指针的有效方法
- 在delete()之后不会断言两个指针都指向NULL
- 更改指针指向指针的位置,同时保持其他两个指针的值