对构造函数的未定义引用

Undefined reference to constructor

本文关键字:引用 未定义 构造函数      更新时间:2023-10-16

编译器 一直告诉我对 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++而言,语言在这里没有问题。