在'y'中请求成员'print',这是非类型的

时间:2013-12-03 18:45:36

标签: c++ oop constructor default

我将通过Nicola Josuttis的COP书中的OOP并使用Code Blocks IDE对他的代码进行试验。我很难理解编译器错误消息。我创建了一个简单的类接口(frac1.hpp),一个类(frac1.cpp)和一个带main() - (ftest.cpp)的测试。该类接受两个整数,它们作为分数打印出来。如果调用w / o任何参数,则类构造函数设置默认值0;如果使用1参数调用则设置整数值;如果使用2个参数调用,则设置分数。如果传递一个或两个参数,则没有编译错误。但是如果没有传递参数,我希望构造函数初始化为0,而不是我得到关于print语句是“非类型”的编译器错误。好像没有创建对象。非常感谢任何有关我所做错事的帮助或解释。 谢谢你的考虑。

课程描述:

//frac1.cpp
#include "frac1.hpp"
#include <iostream>
#include <cstdlib>

//default constructor
Fraction::Fraction()  : numer(0), denom(1)  //initialize fraction to 0
{
    //no further statements
}

Fraction::Fraction(int n) : numer(n), denom(1) //whole integer initialization
{
    //no further statements
}

Fraction::Fraction(int n, int d) : numer(n), denom(d)
{
    if (d==0) {
        std::cerr << "error: denominator is 0" <<std::endl;
        std::exit(EXIT_FAILURE);
    }
}
void Fraction::print()
{
    std::cout<<numer<<'/'<<denom<<std::endl;
}

界面说明:

//frac1.hpp 
#ifndef FRAC1_HPP_INCLUDED
#define FRAC1_HPP_INCLUDED
#include <istream>
#include <cstdlib>

namespace CPPDemo {
    // Fraction Class
    class Fraction {
    private:
        int numer, denom;
    public:
        Fraction();
        Fraction(int);
        Fraction(int,int);

        void print();
    };
}   
#endif // FRAC1_HPP_INCLUDED

测试文件说明:

//ftest.cpp
#include "frac1.hpp"
#include <iostream>
#include <cstdlib>

int main()
{
    CPPDemo::Fraction y();
    y.print();  //flagged as compiler error**
}

来自编译器的消息:

C:\ Users \ User \ Desktop \ CPPDemo \ FractionClassTest \ ftest.cpp:9:错误:请求'y'中的成员'print',这是非类型'CPPDemo :: Fraction()'

3 个答案:

答案 0 :(得分:2)

将测试文件更改为:

int main()
  {
  CPPDemo::Fraction y;
  y.print();  //flagged as compiler error**
  }

如果没有(),编译器就不会将y.prints视为函数调用。我对C ++语法规则的了解不足以给出更好的解释。遗憾。

答案 1 :(得分:2)

变化

CPPDemo::Fraction y();
**y.print;

CPPDemo::Fraction y;
y.print();

因为第一个声明了一个函数,所以它不会声明你想要的对象。 打印功能需要括号(我不知道**是什么)

答案 2 :(得分:1)

您忘记了函数括号()

尝试

y.print()

哦,该死的,这让我又来了。您还需要修复instanciation

CPPDemo::Fraction y;