C++ 未定义类型的使用 #包括 班级核心; 阶级国家; int main(){ std::cin.get(); 返回0; } 阶级国家{ 公众: 国家(核心*核心){ 核心->设置状态(); } }; 类核心{ 公众: 核心(){ 国家(本); } void setState(){ std::cout
在C++ 未定义类型的使用 #包括 班级核心; 阶级国家; int main(){ std::cin.get(); 返回0; } 阶级国家{ 公众: 国家(核心*核心){ 核心->设置状态(); } }; 类核心{ 公众: 核心(){ 国家(本); } void setState(){ std::cout,c++,C++,在State::State中,在实际定义之前,您正在使用核心。在示例中,您可以通过将构造函数实现移出类定义来轻松解决此问题: #include <iostream> class Core; class State; int main (){ std::cin.get(); return 0; } class State{ public: State(Core* core){ core->setState();
State::State
中,在实际定义之前,您正在使用核心
。在示例中,您可以通过将构造函数实现移出类定义来轻松解决此问题:
#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;
}
};
在实践中,将这些函数的实现放在单独的实现(.cpp
)文件中更为常见,在这种情况下,转发声明将按照您的预期工作
在这种情况下:
class State{
public:
State(Core* core);
};
class Core{
// This stays the same...
};
State::State(Core* core)
{
core->setState();
}
及
当您只需要命名(例如,形成指针、引用、函数值参数或返回类型)时,可以向前声明类型。如果您实际使用它(例如,在函数定义中或通过取消引用指针),则需要定义。解决此问题的方法是声明成员函数,而不是定义在
State
的类定义中,您可以在看到核心的定义后定义它:
// State.cpp
#include "State.h"
#include "Core.h"
State::State(Core* core)
{
core->setState();
}
你有类GameState;
但是这个类实际上是在哪里定义的?不,它声明了类型,它没有定义它。非常感谢你,我自己永远不会得到它。
// 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();
}
State::State(Core* core){
core->setState();
}