对构造函数的未定义引用
Undefined reference to constructor
编译器 一直告诉我对 ChangeStateMachine() 构造函数的未定义引用。我被困在它上面大约一个小时,只是盯着代码,找不到任何失败。请帮助我找到我犯错的地方。
这就是我的类文件:
#pragma once
#include <iostream>
class ChangeStateMachine{
private:
int state;
int newState;
public:
ChangeStateMachine();
ChangeStateMachine(int state);
void ChangeState(int newState);
enum STATES{GAME, MENU, GAME_OVER};
};
在这里,我定义了 ChangeStateMachine 构造函数:
#include "main.h"
ChangeStateMachine::ChangeStateMachine()
{
state = MENU;
newState = -1;
}
ChangeStateMachine::ChangeStateMachine(int state)
{
ChangeStateMachine::state = state;
newState = -1;
}
[...]
并在主文件中调用它:
#include <iostream>
#include "main.h"
//GLOBALS
ChangeStateMachine *SetState;
int main(void)
{
//PROJECT INIT
SetState = new ChangeStateMachine();
[...]
确切的编译器错误为:
../precompiled/main.cxx:13: undefined reference to `ChangeStateMachine::ChangeStateMachine()'
非常感谢您的任何回复,Siery。
尽管问题中显示的代码在技术上不是一个最小、完整、可验证的示例,但它足够接近,可以得出以下答案:
因此,我获取了您的头文件,并将其保存为main.h
,删除了特定于编译器的编译指示,从外观上看,无论它实际做什么都不需要:
#include <iostream>
class ChangeStateMachine{
private:
int state;
int newState;
public:
ChangeStateMachine();
ChangeStateMachine(int state);
void ChangeState(int newState);
enum STATES{GAME, MENU, GAME_OVER};
};
然后,我获取了您发布的两个代码片段,并将它们组合成一个main.cpp
文件,其实际的完整内容是:
#include "main.h"
ChangeStateMachine::ChangeStateMachine()
{
state = MENU;
newState = -1;
}
ChangeStateMachine::ChangeStateMachine(int state)
{
ChangeStateMachine::state = state;
newState = -1;
}
ChangeStateMachine *SetState;
int main(void)
{
//PROJECT INIT
SetState = new ChangeStateMachine();
}
我相信毫无疑问,这实际上再现了问题中描述的情况。无论C++代码被分解为一个还是两个翻译单元,只要将所有内容链接在一起就没有区别。我没有看到任何遗漏的细节。
最后,我能够使用 gcc 5.3.1 成功编译和链接示例代码:
$ g++ -o main main.cpp
$
没有链接错误。因此,基于这一点,并根据给出的所有证据,我得出结论,给定的C++代码绝对没有错。问题必须出在编译器的配置和/或实际构建代码的方式上。但是,就C++而言,语言在这里没有问题。
相关文章:
- 编译C++时未定义的引用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 对 Scalar ::Scalar() 的未定义引用
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 对复制 CTOR 和 CTOR 的未定义引用
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 右值引用未定义的行为
- 对"vtable for DigitalClock"的未定义引用 - 未定义对"DigitalClock::staticMetaObject"的引用 - Qt
- 函数类型到函数类型的引用:未定义的引用
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确
- 从c++调用Fortran子程序,链接时引用未定义
- 枚举引用未定义,但位于包含的头文件中