Notice : 内容無保証。禁無断転載。リンク自由。

state_0.cpp

#include <stdio.h>

// デザインパターン - State

//

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 { // 状態1
public:
    Cst_1() ;

    void show(void) ;

    void ev_1(C* c) ;
    void ev_2(C* c) ;
} ;

class Cst_2 : public Cstate { // 状態2
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){/* printf("ev_1 : ") ; */ state->ev_1(this) ;}
void C::ev_2(void){/* printf("ev_2 : ") ; */ 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 ;
}