我创建了一个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;
}
我不断收到错误'+':无法添加两个指针,这很可能意味着我的重载运算符+未正确写入(和/或我的重载赋值运算符)。 我需要做些什么才能纠正这个问题?同样,我的导师希望我使用指针,并且不希望我传递或返回任何东西的副本。我要么通过引用传递(或指针?类似的事情?)。
答案 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)
{
...
}
但是,此功能签名不合法。你不能写一个只接受指针参数的运算符重载。至少有一个参数需要是用户定义的类型(即类,结构)。这只是语言的规则。
与您的老师交谈并澄清您需要做什么。