What I do in my games :
- abstracted away a 'game flow controler' (singleton) whose role is to manage game states
- each state then has s set of methods
- init() called once
- start() called when the game enters this state
- update(double deltaTime) invoked many has long as no state change is required
- end () at the end of the state
- destroy() at the end of the game, or the end of a game phase (when you are sure you will never need this state again)
changing of gamestates is just a matter of invoking 'GameFlowControler.instance().setNextState(nextState)' in the update() method at appropriate times.
It's very simple to implement and powerful enough for most games (although it doesn't support game logic multi threading).
If you add an abstraction of rendering (like a scenegraph), you can even use multiple states working with the same display (like : showing a 'game over effect' while the game gackground is still display'). which is good as it keeps your classes small and dedicated.