[当我尝试重载运算符时出现错误C2296和C3867

问题描述 投票:0回答:1

我想重载运算符(作为自由函数)以处理分数,但出现了一些错误(23)。我的直觉告诉我类似const或smth的问题。现在对我来说有点复杂。那么如何解决这个问题或使这个主题更好呢?

  • 错误C2296'':非法,左操作数的类型为'int(__thiscall 合理的::)(void)const'

  • 错误C2297'':非法,右操作数的类型为'int(__thiscall Rational ::)(void)const'

  • 错误C3867'Rational :: Denominator':非标准语法;使用“&”创建指向成员的指针
#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()
{

}
c++ operator-overloading
1个回答
1
投票

这里的代码有几个问题。

您正在从此行以及紧接其后的行中获取错误

a.Denominator = rhs.Denominator * lhs.Denominator;

这里有两个主要问题。

  1. 您正在尝试分配成员方法的值,而不是调用它
  2. 即使您调用了它,您也试图为返回的const int]分配一个值。
  3. 您可以通过在方法调用a.Denominator()中添加方括号来解决第一个问题,但是第二个错误更为复杂。如果要更改a.den的值(我想这是您要尝试的操作),则需要编写第二个acessor来设置该值。

void Denominator(int denominator){
        den = denominator
}

然后用a.Denominator(/* My new value of a.den */)命名

© www.soinside.com 2019 - 2024. All rights reserved.