我想重载运算符(作为自由函数)以处理分数,但出现了一些错误(23)。我的直觉告诉我类似const或smth的问题。现在对我来说有点复杂。那么如何解决这个问题或使这个主题更好呢?
错误C2296'':非法,左操作数的类型为'int(__thiscall 合理的::)(void)const'
错误C2297'':非法,右操作数的类型为'int(__thiscall Rational ::)(void)const'
#include <iostream>
#include <cmath>
using namespace std;
int GetGsd(int a, int b) { // Greatest common divisor
while (a > 0 && b > 0) {
if (a > b) {
a = a % b;
}
else {
b = b % a;
}
}
return a + b;
}
char GetSignOfFraction(int a, int b) {
if (a >= 0 && b > 0 || a <= 0 && b < 0) {
return '+';
}
else if (a < 0 || b < 0) {
return '-';
}
}
class Rational { // default c
public:
Rational() {
num = 0;
den = 1;
}
Rational(const int numerator, const int denominator) {
num = numerator / GetGsd(numerator, denominator);
den = denominator / GetGsd(numerator, denominator);
}
Rational& operator=(const Rational& r) { // overloaded =
Rational a{ r.num,r.den };
return a;
}
int Numerator() const {
char sign = GetSignOfFraction(num, den);
if (sign == '+') {
return fabs(num / GetGsd(num, den));
}
else {
return num / GetGsd(num, den);
}
}
int Denominator() const {
if (num == 0) {
return 1;
}
return fabs(den / GetGsd(num, den));
}
private:
int num;
int den;
};
Rational operator+(const Rational& lhs, const Rational& rhs) { // overloaded + // problem is there
Rational a;
a.Denominator = rhs.Denominator * lhs.Denominator;
a.Numerator = rhs.Numerator * lhs.Denominator + lhs.Numerator * rhs.Denominator;
a.Numerator /= GetGsd(a.Numerator, a.Denominator);
a.Denominator /= GetGsd(a.Numerator, a.Denominator);
return a;
}
bool operator==(const Rational& lhs, const Rational& rhs) { // and there
if (lhs.Numerator == rhs.Numerator && lhs.Denominator == rhs.Denominator) {
return true;
}
return false;
}
int main()
{
}
这里的代码有几个问题。
您正在从此行以及紧接其后的行中获取错误
a.Denominator = rhs.Denominator * lhs.Denominator;
这里有两个主要问题。
const
int
]分配一个值。您可以通过在方法调用a.Denominator()
中添加方括号来解决第一个问题,但是第二个错误更为复杂。如果要更改a.den的值(我想这是您要尝试的操作),则需要编写第二个acessor来设置该值。
void Denominator(int denominator){ den = denominator }
然后用
a.Denominator(/* My new value of a.den */)
命名