13
#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++ 语法吗?

编辑:对不起,游戏状态错字,我已将其更改为状态,它仍然会产生错误。

4

2 回答 2

23

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();
}
于 2013-08-17T02:59:19.017 回答
4

当您只需要命名时,您可以前向声明类型,例如,形成指针、引用、函数值参数或返回类型。如果您大量使用它,例如,在函数定义中或通过取消引用指针,您需要该定义。关于这个问题的处理方法是声明成员函数而不是在类定义中定义它State。相反,一旦看到 的定义,您就可以定义它Core

State::State(Core* core){
    core->setState();
}
于 2013-08-17T03:01:35.880 回答