2016-07-24 5 views
1

Я создаю конечный автомат для переключения состояний игры (play-> menu-> setup) в свой игровой движок, но у меня возникает ошибка сегментации. Я могу изменить состояние игры с верхнего уровня, но как я могу изменить состояние игры из состояния игры?Ошибка сегментации при попытке изменить состояние игры

Вот минимальный пример кода:

#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; 
} 
+0

Мы не знаем, что 'gameStates' есть. Это похоже на очередь, но я не могу сказать, как это реализовано. –

+0

gameStates - стандартный std :: вектор GameState *. – lefti

ответ

1

по какой-то причине stateManager не будучи установленным в GameState конструктора.

так попробовать это:

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

    virtual ~GameState(); 

    virtual void update() = 0; 

    GameStateManager* stateManager; 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^