好吧,我来自Java和Python,所以请耐心等待一下。我一直在互联网上寻找学习如何在c ++中使用头文件,我一直没事,直到我被绑定来定义一个类。这是我的代码。
notAClock.h
#ifndef NOTACLOCK_H_
#define NOTACLOCK_H_
namespace thenewboston {
class notAClock {
public:
notAClock();
virtual ~notAClock();
int isAClock();
};
} /* namespace thenewboston */
#endif /* NOTACLOCK_H_ */
notAClock.cpp
/*
* notAClock.cpp
*
* Created on: Dec 22, 2012
* Author: pipsqueaker
*/
#include "notAClock.h"
namespace thenewboston {
notAClock::notAClock() {
// TODO Auto-generated constructor stub
}
notAClock::~notAClock() {
// TODO Auto-generated destructor stub
}
int notAClock::isAClock() {
return 0;
}
} /* namespace thenewboston */
,最后,我的主文件
#include <iostream>
#include "notAClock.h"
using namespace std;
int main() {
cout << "program works" << endl;
notAClock play;
}
当Eclipse尝试为我编译时(我正在使用CDT插件)它会抛出一个错误,相关部分是
../src/main.cpp:13: error: 'notAClock' was not declared in this scope
../src/main.cpp:13: error: expected `;' before 'play'
make: *** [src/main.o] Error 1
我能解决的最多是在主类中未定义notAClock。我做错了什么?
-pipsqueaker117
答案 0 :(得分:4)
您拥有命名空间内的类。它需要有资格使用它:
thenewboston::notAClock play;
或者添加using
指令以允许对该类进行非限定访问:
using thenewboston::notAClock;
notAClock play;
或者using namespace
指令来引入整个命名空间:
using namespace std;
using namespace thenewboston;
int main() {
cout << "program works" << endl;
notAClock play;
}
答案 1 :(得分:0)
要解决“如何在c ++中使用头文件”问题的一部分,请注意以下几点:
1)C ++中的头文件与java或python中的包导入不同:当你在C ++中使用#include时,文件的文本在编译期间被包含在源文件中(忽略预编译的头文件,这是一个优化),以及与正在编译的文件一起编译的内容。这意味着整个项目中经常出现的任何头文件#incound都会被反复编译。这就是为什么在C ++中将#includes保持在绝对最小值的原因之一。
2)在样式方面,许多人更喜欢在公共头文件中保留公共接口类声明(例如,参见“pimpl”习语),并将具体的类定义放入.cpp文件中。这使类的实现的内部细节与其公共接口在物理上分离。当类的实现发生更改时,只需要重新编译具有实现代码的文件。如果将类的实现放在广泛的头文件中,那么不仅在开发过程中会产生更多更长的构建,而且非相关代码更可能“混乱”类的实现并导致难以实现-debug问题。