对构造函数

时间:2016-01-30 01:04:35

标签: c++ undefined

编译器一直告诉我有关对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。

1 个答案:

答案 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 ++就没有问题了。