-1

我正在努力测试这个类中的每个函数,我无法测试将分子和分母分配给不带参数的构造函数的函数这里是我的代码。我收到对“first”中非类类型“Rational”的成员“numerator”的此错误请求

#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;
}
4

2 回答 2

2

Rational first();被解析为函数声明。它被称为最令人烦恼的解析

你可以使用Rational first;
And 在 C++11 中,你也可以使用Rational first{};

于 2014-02-01T15:00:45.117 回答
0

没有理由将函数标记为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);
于 2014-02-01T15:28:37.143 回答