fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. template<typename T, typename ...Args>
  5. std::unique_ptr<T> make_unique( Args&& ...args )
  6. {
  7. return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
  8. }
  9.  
  10. class StateManager;
  11.  
  12. class State
  13. {
  14. public:
  15. virtual void update(StateManager &manager)= 0;
  16. virtual ~State(){}
  17. };
  18.  
  19.  
  20.  
  21.  
  22. class StateManager
  23. {
  24. public:
  25. void setState(std::unique_ptr<State> && newState )
  26. {
  27. currentState = std::move(newState);
  28. }
  29. std::unique_ptr<State> currentState;
  30.  
  31. void run()
  32. {
  33. currentState->update(*this);
  34. }
  35. };
  36.  
  37.  
  38. class SecondState : public State
  39. {
  40. public:
  41. SecondState()
  42. {
  43. std::cout<<"CONSTRUCTOR: Second State"<<std::endl;
  44. }
  45.  
  46. virtual void update(StateManager &manager)
  47. {
  48. std::cout<<"UPDATE: Second State"<<std::endl;
  49. }
  50.  
  51. virtual ~SecondState()
  52. {
  53. std::cout<<"DESTRUCTOR: Second State"<<std::endl;
  54. }
  55. };
  56.  
  57.  
  58. class FirstState : public State
  59. {
  60. public:
  61. FirstState()
  62. {
  63. std::cout<<"CONSTRUCTOR: FirstState"<<std::endl;
  64. }
  65.  
  66. virtual void update(StateManager &manager)
  67. {
  68. std::cout<<"UPDATE: FirstState"<<std::endl;
  69. manager.setState(make_unique<SecondState>());
  70. std::cout<<"UPDATE-ENDING: FirstState"<<std::endl;
  71.  
  72. }
  73.  
  74. virtual ~FirstState()
  75. {
  76. std::cout<<"DESTRUCTOR: FirstState"<<std::endl;
  77. }
  78. };
  79.  
  80.  
  81. int main()
  82. {
  83.  
  84. StateManager manager;
  85. manager.setState(make_unique<FirstState>());
  86. manager.run();
  87. manager.run();
  88.  
  89. }
Success #stdin #stdout 0s 3020KB
stdin
Standard input is empty
stdout
CONSTRUCTOR: FirstState
UPDATE: FirstState
CONSTRUCTOR: Second State
DESTRUCTOR: FirstState
UPDATE-ENDING: FirstState
UPDATE: Second State
DESTRUCTOR: Second State