самый неприятный синтаксический анализ — запрос на член, не принадлежащий к типу класса Переполнение стека

Я стараюсь протестировать каждую функцию в этом классе, и я не могу протестировать функцию, которая назначит числитель и знаменатель для конструктора, который не принимает аргументов, вот мой код. Я получаю этот запрос об ошибке для члена «числитель» в «первом», который не является типом класса «Rational»

#include "Rational.h"#include <iostream>
#include <string>

#include "GCD.h"#include <assert.h>

using namespace std;

Rational:: Rational()
{
myNumerator = 1;
myDenominator = 1;
}

Rational:: Rational(int numerator, int denominator)
{
assert(denominator != 0);
myNumerator = numerator;
myDenominator = denominator;
reduce();
}

Rational:: Rational(const Rational &r)
{
myNumerator = r.myNumerator;
myDenominator = r.myDenominator;
}
const Rational& Rational :: operator = (const Rational &rhs)
{
if (this != &rhs)
{
myNumerator = rhs.myNumerator;
myDenominator = rhs.myDenominator;
return rhs;
}
}

int Rational:: numerator(int a) const
{
myNumerator = a;
return myNumerator;
}
int Rational:: denominator(int b) const
{
myNumerator = b;
return myDenominator;
}
void Rational:: reduce()
{

int commonDivisor = GCD(myNumerator, myDenominator);
myNumerator = myNumerator / commonDivisor;
myDenominator = myDenominator / commonDivisor;
}

Rational operator + (const Rational &lhs, const Rational &rhs)
{
int numerator = lhs.numerator() * rhs.denominator() + rhs.numerator() * lhs.denominator();
int denominator = lhs.denominator() * rhs.denominator();
Rational sum(numerator, denominator);
return sum;
}

Rational operator - (const Rational &lhs, const Rational &rhs)
{
int numerator = lhs.numerator() * rhs.denominator() + rhs.numerator() * lhs.denominator();
int denominator = lhs.denominator() * rhs.denominator();
Rational difference(numerator, denominator);
return difference;
}
Rational operator * (const Rational &lhs, const Rational &rhs)
{
int numerator = lhs.numerator() * rhs.numerator();
int denominator = lhs.denominator() * rhs.denominator();
Rational product(numerator, denominator);
return product;
}
Rational operator / (const Rational &lhs, const Rational &rhs)
{
int numerator = lhs.numerator() * rhs.denominator();
int denominator = lhs.denominator() * rhs.numerator();
Rational product(numerator, denominator);
return product;
}ostream& operator << (ostream & os, const Rational &r)
{
os << r.numerator() << "/" << r.denominator();
return os;
}

istream& operator >> (istream &is, Rational &r)
{
char divisionSymbol;
int numerator = 0, denominator = 0;

is >> numerator >> divisionSymbol >> denominator;
assert(divisionSymbol == '/');
assert(denominator != 0);
Rational number(numerator, denominator);
r = number;
return is;
}

#include <iostream>
#include "Rational.h"
using namespace std;

int main()
{
Rational first(), second(75, 350), third(13, 55);
Rational fourth(second);
cout << first << endl << second << endl << third << endl << fourth <<endl;

first.numerator(3)const;
first.denominator(5)const;

cout << first;
}

-1

Решение

Rational first(); анализируется как объявление функции. это известно как Самый неприятный разбор.

Вы можете использовать Rational first;
И в C ++ 11 вы также можете использовать Rational first{};

2

Другие решения

Нет причин отмечать ваши функции как const если вы собираетесь изменить свои переменные-члены. Это обещание, что вы не будет модифицировать *this и вы все равно делаете это. Так что просто удали это. Вы также предоставляете const все равно «добытчики».

int numerator(int a);
int numerator() const {return myNumerator;}
int denominator(int b);
int denominator() const {return myDenominator;}
int Rational:: numerator(int a)
{
// ..
}
int Rational:: denominator(int b)
{
// ..
}

Ваш оператор присвоения копии также не имеет смысла. Я предлагаю изменить это:

if (this == &rhs)
{
return *this;
}
myNumerator = rhs.numerator();
myDenominator = rhs.denominator();
return *this;

Теперь за ошибку, указанную другими, ваш компилятор с радостью предупреждает, что empty parentheses interpreted as a function declaration, Просто удалите скобки или замените их скобками {} в режиме C ++ 11. Кроме того, вам не нужно const ключевое слово при вызове const функция-член.

Rational first, second(75, 350), third(13, 55);
first.numerator(3);
first.denominator(5);
0

По вопросам рекламы [email protected]