基础主题:秒表
下面我们要为一个机械秒表建模一个状态机。这样一个秒表通常会有两个按钮。
* Start/Stop
* Reset
同时有两种状态:
* Stoped: 表针停留在上次停止时的位置:
o 按下Reset按钮,表针回退到0的位置。秒表保持在Stoped状态不变。
o 按下Start/Stop按钮,秒表转到Running状态。
* Running: 表针在移动,并持续显示过去的时间:
o 按下Reset按钮,表针回退到0的位置,秒表转到停止状态。
o 按下Start/Stop按钮,转到Stoped状态。
下面是其UML图: 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 ;
}
这个代码已经可以编译了,但不会发生任何可察觉的事件。

boost状态机学习二(秒表)的更多相关文章

  1. boost asio 学习(二)了解boost::bind

    2.了解boost::bind使用boost::bind封装一个函数,考虑以下例子示例2a #include <iostream> #include <boost/bind.hpp& ...

  2. c++ boost库学习二:内存管理->智能指针

    写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...

  3. boost库学习之开篇

    本系列文章使用boost_1.58.0版本. 一.欢迎使用boost C++库 boost致力于提供一个免费的.便携的源代码级的库. 我们重视那些与C++标准一起工作良好的库.boost库将要成为一个 ...

  4. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  5. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  6. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  7. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  8. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  9. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

随机推荐

  1. flex 3 rows layout

    html,body{height:100%} .wraper{ display:flex; flex-direction:column; height:100%; flex-wrap: nowrap; ...

  2. C# lambda表达式及初始化器

    using System;using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1d { c ...

  3. C# 与 Unity 同名函数

    1,Random,直接使用Random会报错,要么使用UnityEngine.Random,要么使用System.Random

  4. freemarker语法简介

    ftl是一种模板标记语言,用于渲染数据,输入html结构.语法简介如下: ${book.name} ${book.name?if_exists} //值是否存在 ${book.name??} //值是 ...

  5. 对于JVM内存配置参数

    -Xmx:最大堆大小 -Xms:初始堆大小 -Xmn:年轻代大小 -XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值 年轻代5120m, Eden:Survivor=3 ...

  6. Linux及安全——ELF实践

    Linux及安全——ELF实践  一.分析ELF文件头 二.通过文件头找到section header table,理解内容 三.通过section header table 找到各section 四 ...

  7. HoloLens开发手记 - Unity之Spatial Sounds 空间声音

    本文主要讲述如何在项目中使用空间声音特性.我们主要讲述必须的插件组件和Unity声音组件和属性的设置来确保空间声音的实现. Enabling Spatial Sound in Unity 在Unity ...

  8. 《1024伐木累》-te别篇,庭审你知道吗?

    思前想后,我觉得不应该发这一期,因为,做完这一期之后突然发觉,自己失去了主题,到底是在讽刺?还是在讽刺?还是在讽刺呢?不论是什么,大家自己判断吧.就当作者不想发表自己的观点,先看这一期的对白吧! 1. ...

  9. [C#基础]ref和out的区别

    在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:       ref 关键字使参数按 ...

  10. 第八章:Javascript函数

    函数是这样一段代码,它只定义一次,但可能被执行或调用任意次.你可能从诸如子例程(subroutine)或者过程(procedure)这些名字里对函数概念有所了解. javascript函数是参数化的: ...