Запрос на член, не принадлежащий к классу типа C++

Я стараюсь протестировать каждую функцию в этом классе, и я не могу протестировать функцию, которая назначит числитель и знаменатель для конструктора, который не принимает аргументов, вот мой код. Я получаю этот запрос об ошибке для члена "числитель" в "первом", который не является типом класса "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;
}

2 ответа

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

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

Нет причин отмечать ваши функции как 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);
Другие вопросы по тегам