层次式状态处理函数-2014年度辛星python面向对象教程
4.4层次式状态处理函数在QEP,状态被表示为状态处理函数,处理由它们实现的状态的全部事件。层次式状态处理函数使用完全一致的格式QStateHandler ,和在第三章3.6节的非层次式状态处理函数一样。它们对我们前面讨论的非层次式状态处理函数唯一的扩展是,一个层次式状态处理函数必须特别通知事件处理器有关状态嵌套层次的信息。当这个层次式状态处理函数不处理这个事件,它必须提供一个超状态,这样事件处理器可以根据状态嵌套的语义调用超状态的处理函数(见第2.3.2节)。层次式状态处理函数提供这个特别的信息给事件处理器非常类似它通知事件处理器有关一个状态转换的情况。状态处理函数把状态变量给超状态处理函数并返回一个特定的状况信息,从而把状态处理和状态迁移区分开来。 4.4.1标识超状态(宏Q_SUMPER())当一个层次式状态处理函数不处理当前的事件,它返回一个宏Q_SUPER( )给事件处理器,定义如下: #define Q_RET_SUPER ((QState)3) #define Q_SUPER(super_) \ (((QHsm *)me)->state = (QStateHandler)(super_), Q_RET_SUPER)宏Q_SUPER( )被定义为使用逗号表达式。一个逗号表达式从左到右被计算,整个表达式的类型和值是在最右边的操作数。在这里,最右边的操作数是操作的状况(超状态),它从状态处理函数返回。这个设计的关键在于宏Q_SUPER( )能被用于从QHsm派生(继承)的结构,这样在C语言里需要一个显式的从QHsm基础结构的转换(向上转换),(见第一章边栏“ C语言里的单一继承”)。 4.4.2 C语言实现的层次式状态处理函数清单4.4展示了一个对应于在图2.19的计算器状态图的状态ini1的层次式状态处理函数的实例。状态int1控制输入第一个操作数的整数部分。清单6一个C语言的层次式状态处理函数(文件calc.c) (1) QState Calc_int1(Calc *me, QEvent const *e) { (2) switch (e->sig) { (3) case DIGIT_0_SIG: /* intentionally fall through */ (4) case DIGIT_1_9_SIG: { (5) BSP_insert(((CalcEvt const *)e)->key_code); (6) return Q_HANDLED(); } case POINT_SIG: { BSP_insert(((CalcEvt const *)e)->key_code); (7) return Q_TRAN(&Calc_frac1);保留中文简体翻译的全部版权anymcu@gmail.com 2010 123
4.33MB
文件大小:
评论区