首页 > 解决方案 > 尝试重载运算符时出现错误 C2296 和 C3867

问题描述

我想重载运算符(作为自由函数)来处理分数,但出现了一些错误(23)。我的直觉告诉我 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()
{

}

标签: c++operator-overloading

解决方案


您的代码在这里有几个问题。

您从该行和紧随其后的行中得到错误

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

这里有两个主要问题。

  1. 您正在尝试分配成员方法的值而不是调用它
  2. 即使您调用它,您也试图将值分配给返回的constint

您可以通过简单地在方法调用中添加括号来解决第一个问题a.Denominator(),但是第二个错误更复杂。如果您想更改 a.den 的值(我认为这是您尝试做的),您将需要编写第二个可用于设置值的访问器。

void Denominator(int denominator){
        den = denominator
}

然后调用它a.Denominator(/* My new value of a.den */)


推荐阅读