编译器一直告诉我有关对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。
答案 0 :(得分:0)
虽然问题中显示的代码在技术上不是最小,完整,可验证的示例,但它足够接近以下答案:
所以,我拿了你的头文件,并把它保存为main.h
,删除了编译器特定的pragma,从它的外观来看,不管它实际上做什么都不需要:
#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 ++就没有问题了。