我将通过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()'
答案 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;