Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图更改游戏状态时出现分段错误_C++_Segmentation Fault_State Machine - Fatal编程技术网

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;istd::cout由于某种原因,
stateManager
未在
GameState
构造函数中设置

所以试试这个:

class GameState {
public:
    GameState(GameStateManager* StateManager) : stateManager(StateManager) 
    {   
    };

    virtual ~GameState();

    virtual void update() = 0;

    GameStateManager* stateManager;
};

我们不知道什么是
gameStates
。它看起来像一个队列,但我不知道它是如何实现的。gameStates是GameState*的标准std::vector。