Я получил ошибку C2296 и C3867 при попытке перегрузить оператор - PullRequest
0 голосов
/ 23 марта 2020

Я хочу перегрузить операторы (как свободные функции) для работы с дробями, но получил некоторые ошибки (23). Моя интуиция говорит мне, что проблема с const или что-то в этом роде. Это немного сложно для меня сейчас. Так как это исправить или получить эту тему лучше?

  • Ошибка C2296 '': недопустимый, левый операнд имеет тип 'int (__thiscall
    Rational ::
    ) (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()
{

}

1 Ответ

1 голос
/ 23 марта 2020

Здесь несколько проблем с вашим кодом.

Вы получаете ошибки из этой строки и строк сразу после нее

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

Есть два основные проблемы здесь.

  1. Вы пытаетесь присвоить значение члена метод вместо его вызова
  2. Даже если вы вызвали его, вы пытаетесь назначить значение возвращаемого constint

Первую проблему можно решить, просто добавив скобки к вызову метода a.Denominator(), однако вторая ошибка более сложный. Если вы хотите изменить значение a.den (что, я думаю, именно то, что вы пытаетесь сделать), вам нужно написать второй acessor, который можно использовать для установки значения.

void Denominator(int denominator){
        den = denominator
}

Затем позвоните по номеру a.Denominator(/* My new value of a.den */)

...