Boost的状态机库教程(2)

Boost的状态机库教程(2)
转: http://www.cppblog.com/shaker/archive/2010/08/16/123598.html

1 基础主题:秒表
    下面我们要为一个机械秒表建模一个状态机。这样一个秒表通常会有两个按钮。
     * Start/Stop
     * Reset
     同时有两种状态:
     * Stoped: 表针停留在上次停止时的位置:
        o 按下Reset按钮,表针回退到0的位置。秒表保持在Stoped状态不变。
        o 按下Start/Stop按钮,秒表转到Running状态。
     * Running: 表针在移动,并持续显示过去的时间:

        o 按下Reset按钮,表针回退到0的位置,秒表转到停止状态。
        o 按下Start/Stop按钮,转到Stoped状态。
    下面是其UML图:


Boost的状态机库教程(2)_第1张图片

1.1 定义状态和事件
两个按钮可以建模为两个事件。进而,定义出必要的状态和初始状态。我们从下面的代码开始,以前的代码片段会陆续加入其中:

 

#include  < boost / statechart / event .hpp >
#include 
< boost / statechart / state_machine.hpp >
#include 
< boost / statechart / simple_state.hpp >

namespace  sc  =  boost::statechart;

struct  EvStartStop : sc:: event <  EvStartStop  >   {} ;
struct  EvReset : sc:: event <  EvReset  >   {} ;

struct  Active;
struct  StopWatch : sc::state_machine <  StopWatch, Active  >   {} ;

struct  Stopped;

//  这里的simple_state类模板可以接受4个参数:
//  - 第3个参数指定内部的初始状态,如果有一个这样的状态的话。
//    在这里,Active有一个内部状态(Stoped), 所以将这个内部
//    初始状态传给它的基类。
//  - 第4个参数指定是否保留和保留什么类型历史

//  Active是最外层的状态,因此要把它所属的状态机类传给它
struct  Active : sc::simple_state <
  Active, StopWatch, Stopped 
>   {} ;

//  Stopped 和 Running 都把Active作为它们的上下文,这使他们嵌入到了Active状态中。
struct  Running : sc::simple_state <  Running, Active  >   {} ;
struct  Stopped : sc::simple_state <  Stopped, Active  >   {} ;

//  因为状态的上下文必须是一个完整的类型(不能单单是声明),
//  所以状态机必须要在“外层状态”之间先定义。
//  也就是说,我们需要从状态机开始,然后是最外层的状态,然后是其内部的状态,如此反复。
//  我们可以用广度或深度方式,再或是以两都混合的方式来进行定义。

int  main()
{
  StopWatch myWatch;
  myWatch.initiate();
  
return 0;
}

这个代码已经可以编译了,但不会发生任何可察觉的事件。

你可能感兴趣的:(Boost的状态机库教程(2))