C++ 试图更改游戏状态时出现分段错误
我正在制作一个状态机,用于在我的游戏引擎中切换游戏状态(播放->菜单->设置),但我遇到了一个分段错误。我可以从较高级别更改游戏状态,但是如何从游戏状态中更改游戏状态? 下面是一个简单的代码示例:C++ 试图更改游戏状态时出现分段错误,c++,segmentation-fault,state-machine,C++,Segmentation Fault,State Machine,我正在制作一个状态机,用于在我的游戏引擎中切换游戏状态(播放->菜单->设置),但我遇到了一个分段错误。我可以从较高级别更改游戏状态,但是如何从游戏状态中更改游戏状态? 下面是一个简单的代码示例: #include <iostream> #include <vector> class GameStateManager; class GameState { public: GameState(GameStateManager* StateManager) {
#include <iostream>
#include <vector>
class GameStateManager;
class GameState {
public:
GameState(GameStateManager* StateManager) {
StateManager = stateManager;
};
virtual ~GameState();
virtual void update() = 0;
GameStateManager* stateManager;
};
class GameStateManager {
public:
GameStateManager();
~GameStateManager();
void changeGameState(GameState* state) {
if(!running) {
running = true;
}
// Cleanup the current state
if(!gameStates.empty()) {
for(unsigned int i = 0; i < gameStates.size(); i++) {
delete gameStates[i];
}
gameStates.clear();
std::cout << "Cleaning up GameState" << std::endl;
}
// Store and initialize the new game state
gameStates.push_back(state);
};
void update() {
if(!gameStates.empty()) {
gameStates.back()->update();
}
};
std::vector<GameState*> gameStates;
bool running;
};
class PlayState : public GameState {
public:
PlayState(GameStateManager* stateManager) : GameState(stateManager) {};
~PlayState();
void update() override {
// On some flag, initiate the next level
nextLevel();
};
void nextLevel() {
stateManager->changeGameState(new PlayState(stateManager));
};
};
int main() {
GameStateManager stateManager;
stateManager.changeGameState(new PlayState(&stateManager));
while(stateManager.running) {
for(unsigned int i = 0; i < 10000; i++) {
std::cout << "Round: " << i << std::endl;
// Segmentation fault here
stateManager.update();
// This works
//stateManager.changeGameState(new PlayState(&stateManager));
}
stateManager.running = false;
}
return 0;
}
#包括
#包括
班级经理;
类配子态{
公众:
游戏状态(GameStateManager*StateManager){
StateManager=StateManager;
};
虚拟~GameState();
虚拟void update()=0;
GameStateManager*stateManager;
};
类GameStateManager{
公众:
GameStateManager();
~GameStateManager();
无效更改游戏状态(游戏状态*状态){
如果(!正在运行){
运行=真;
}
//清除当前状态
如果(!gameStates.empty()){
for(unsigned int i=0;i std::cout由于某种原因,stateManager
未在GameState
构造函数中设置
所以试试这个:
class GameState {
public:
GameState(GameStateManager* StateManager) : stateManager(StateManager)
{
};
virtual ~GameState();
virtual void update() = 0;
GameStateManager* stateManager;
};
我们不知道什么是gameStates
。它看起来像一个队列,但我不知道它是如何实现的。gameStates是GameState*的标准std::vector。