#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 ++语法吗?
编辑:对于游戏状态拼写错误,我已将其更改为状态,但仍然会产生错误。答案 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();
}