所以我正在尝试学习C ++,而且我已经使用了头文件了。他们真的对我毫无意义。我尝试了很多这方面的组合,但迄今为止没有任何工作:
Main.cpp的:
#include "test.h"
int main() {
testClass Player1;
return 0;
}
test.h:
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
class testClass {
private:
int health;
public:
testClass();
~testClass();
int getHealth();
void setHealth(int inH);
};
#endif // TEST_H_INCLUDED
TEST.CPP:
#include "test.h"
testClass::testClass() { health = 100; }
testClass::~testClass() {}
int testClass::getHealth() { return(health); }
void testClass::setHealth(int inH) { health = inH; }
我想要做的很简单,但是头文件的工作方式对我来说根本没有意义。代码块在构建时返回以下内容:
obj \ Debug \ main.o(。text + 0x131)||函数
main':| *voip*\test\main.cpp |6|undefined reference to
testClass :: testClass()'| obj \ Debug \ main.o(。text + 0x13c): voip \ test \ main.cpp | 7 |对`testClass :: ~testClass()'的未定义引用 || ===构建完成:2个错误,0个警告=== |
我很感激任何帮助。或者,如果你有一个体面的教程,那也没关系(我用Google搜索的大多数教程没有帮助)
答案 0 :(得分:3)
您设置标头的方式没有任何问题。链接期间发生错误。什么是你的gcc命令行?我的猜测是你正在编译main.cpp,并忘记了test.cpp。
答案 1 :(得分:3)
Code :: Blocks不知道它必须编译test.cpp
并生成目标文件test.o
(以便后者可以与main.o
链接在一起以生成可执行文件)。您必须将test.cpp
添加到项目中。
在Code :: Blocks中,转到菜单中的Project>Add File
并选择test.cpp
文件。确保选中Release和Debug复选框。
然后Build->Rebuild
。
修改强>
这里有一个提示,可以帮助您在编译时看到IDE正在做什么。转到Settings -> Compiler and Debugger -> Global Compiler Settings -> Other settings
,然后在Full command line
下拉框中选择Compiler logging
。现在,无论何时构建,gcc编译器命令都将记录在构建日志中。每当StackOverflow上有人询问您使用的gcc命令行时,您都可以复制并粘贴构建日志中的内容。
答案 2 :(得分:0)
您使用什么命令构建?您似乎没有在test.cpp
中进行编译和链接,因此当main.cpp
去寻找合适的符号时,它找不到它们(链接失败)。
答案 3 :(得分:0)
如其他答案所述,这是一个链接错误。像这样编译和链接:
g++ Main.cpp test.cpp -o myprogram -Wall -Werror
答案 4 :(得分:0)
关于头文件的一些(简要)信息 - .cpp文件中的#include行只是指示编译器将该文件的内容粘贴到此时要编译的流中。因此,他们允许您在一个地方(test.h)声明testClass并在许多地方使用它。 (main.cpp,someother.cpp,blah.cpp)。你的test.cpp包含了testClass方法的定义,所以你需要将它链接到最终的可执行文件中。
但是头文件并没有什么神奇之处,只是简单的文本替换是为了方便,所以你不必一遍又一遍地声明相同的类或函数。你已经(正确地)得到了#ifndef TEST_H_INCLUDED的内容,这样你就有了其他的#includes test.h和main.cpp#包括test.h和someother.h,你只会得到它们testClass声明的单个副本。
希望这有帮助!