【问题标题】:request for a member in which is of non class type c++请求非类类型 c++ 的成员
【发布时间】:2014-01-31 22:14:50
【问题描述】:

我正在努力测试这个类中的每个函数,我无法测试将分子和分母分配给不带参数的构造函数的函数这里是我的代码。我收到了对“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;
}

【问题讨论】:

标签: c++ most-vexing-parse


【解决方案1】:

Rational first(); 被解析为函数声明。它被称为Most vexing parse。

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

【讨论】:

    【解决方案2】:

    如果您要修改成员变量,则没有理由将您的函数标记为const。这是一个你不会修改*this的承诺,无论如何你都会这样做。因此,只需将其删除。无论如何,您还提供const“getters”。

    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);
    

    【讨论】:

    • 我还是不明白
    猜你喜欢
    • 2019-04-28
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多