使用未定义的类型

时间:2013-08-17 02:57:44

标签: c++

#include <iostream>

class Core;
class State;

int main (){
        std::cin.get();
        return 0;
}

class State{
public:
    State(Core* core){
        core->setState();
    }
};

class Core{
public:
    Core(){
        State state(this);
    }
    void setState(){
        std::cout << "setting state" << std::endl;
    }
};

我不断收到“使用未定义类型”错误。我认为,如果我转发声明两个类,它将解决问题,但我无法弄明白。我只是缺少愚蠢的c ++语法吗?

编辑:对于游戏状态拼写错误,我已将其更改为状态,但仍然会产生错误。

2 个答案:

答案 0 :(得分:20)

State::State中,您在实际定义之前使用Core。您可以在示例中轻松解决此问题:

class State{
public:
    State(Core* core);
};

class Core{
   // This stays the same...
};

State::State(Core* core)
{
   core->setState();
}

在实践中,在单独的实现(.cpp)文件中实现这些函数更为常见,在这种情况下,前向声明将按预期工作。

在那种情况下:

// State.h
class Core

class State{
public:
    State(Core* core);
};

// Core.h
#include "State.h"
#include <iostream> //This is probably a good reason to further separate
                    //Core.h into Core.h and Core.cpp

class Core{
public:
    Core(){
        State state(this);
    }

    void setState(){
        std::cout << "setting state" << std::endl;
    }
};

执行文件:

// State.cpp
#include "State.h"
#include "Core.h"

State::State(Core* core)
{
   core->setState();
}

答案 1 :(得分:4)

当您只需要命名时,可以转发声明类型,例如,形成指针,引用,函数值参数或返回类型。如果您基本上使用它,例如,在函数定义中或通过取消引用指针,则需要定义。处理问题的方法是声明成员函数,但不在State的类定义中定义它。相反,一旦看到Core的定义,就会定义它:

State::State(Core* core){
    core->setState();
}