#include <stdio.h>
class C {
class Cstate* state ;
public:
C() ;
~C() ;
void showState(void) ;
void ev_1(void) ;
void ev_2(void) ;
void changeState(Cstate* newState) ;
} ;
class Cstate {
public:
virtual void show(void) = 0 ;
virtual void ev_1(C* c) = 0 ;
virtual void ev_2(C* c) = 0 ;
} ;
class Cst_1 : public Cstate {
public:
Cst_1() ;
void show(void) ;
void ev_1(C* c) ;
void ev_2(C* c) ;
} ;
class Cst_2 : public Cstate {
public:
Cst_2() ;
void show(void) ;
void ev_1(C* c) ;
void ev_2(C* c) ;
} ;
C::C(){state = new Cst_1() ;}
C::~C(){delete state ;}
void C::showState(void){state->show() ;}
void C::ev_1(void){ state->ev_1(this) ;}
void C::ev_2(void){ state->ev_2(this) ;}
void C::changeState(Cstate* newState){
if (newState) {
delete state ;
state = newState ;
}
}
Cst_1::Cst_1(){} ;
void Cst_1::show(void){printf("state 1\n") ;}
void Cst_1::ev_1(C* c) {}
void Cst_1::ev_2(C* c) {c->changeState(new Cst_2) ;}
Cst_2::Cst_2(){} ;
void Cst_2::show(void){printf("state 2\n") ;}
void Cst_2::ev_1(C* c) {c->changeState(new Cst_1) ;}
void Cst_2::ev_2(C* c) {}
int main(void){
C c ;
c.showState() ;
c.ev_1() ; c.showState() ;
c.ev_2() ; c.showState() ;
c.ev_1() ; c.showState() ;
c.ev_1() ; c.showState() ;
c.ev_2() ; c.showState() ;
c.ev_2() ; c.showState() ;
return 0 ;
}