boost 里面有状态机了_Boost的状态机库教程(1)

介绍

Boost状态机库一个应用程序框架,你可以用它将UML状态图快速的转换为可执行的c++代码,而不需要任何的代码生成器。它支持几乎所有的UML特征,可以直接了当的转换,并且转换后的c++代码就像对状态机进行一次文本描述一样具体可读性。

如何阅读这个教程

这个教程是以线性阅读的方式进行的章节设计。如果你是第一次看这个教程的话,你可以从头开始读,到你觉得了解的东西对你手头的任务来说已经足够时就停止。具体可以这样:

* 如果你的任务是要实现一个小的、简单的,并且有很少几个状态的状态机,那么下面的“初级主题:秒表”里所讲的就差不多够你用的了。

* 如果你要做一个有很多状态的大型状态机,你可以看一下“中级主题:数码相机”,那里的讲解可能对你有帮助。

* 最后,如果你是一个要创建异常复杂状态机的用户,或者是一个想要评估一个Boost状态机的设计师的话,你就要看一下“高级主题”部分。并且,我还强烈建议你看一下Rationle里的Limitions部分。

Hello World!

我们将要从一个最简单程序开始我们的第一步,状态图如下:

对于这个状态图,我们的实现代码如下:

#include

#include

#include

namespace sc = boost::statechart;

// 为了避免写public,下面声明的类型全部为struct。

// 如果你不在乎的话可以把它们都改成class。

// 我们需要先声明一下初始状态,这是因为我们要在定义状态机时使用它

// 但又不得不在状态机这后定义它。

struct Greeting;

// Boost.Statechart大量应用模板模式。

// 派生类必须将自己做为基类模板的第一个参数。

//

// 状态机必须要知道当其初始化后进行的第一个状态。

// 这就是为什么Greeting要做为每二个模板参数。

// (译者注:也就是说Greeting状态是Machine状态机初始化后进入的第一个状态)

struct Machine : sc::state_machine< Machine, Greeting > {};

// 对于每一个状态,我们需要为其指明:它属于哪一个状态机,它位于状态图的哪个位置。

// 我们用simple_state<>的上下文参数就可以完成这些指定了。

// 对于我们目前的这个简单的状态机来说,上下文就是状态机(Machine)

// 所以,Machine必须要做为simple_state的第二个模块参数。

// (关于上下文参数的详细解释在下一个例子中有)

struct Greeting : sc::simple_state< Greeting, Machine >

{

// 一旦状态机进行一个状态的时候,它就要创建一个相应状态类的对象(类实例)

// 只要状态机保持在这个状态下,这个对象就会一直存在。

// 最后,当状态机离开这个状态时,对象被销毁。

// 所以,一个状态的进入动作就是这个状态类的构造器,而它的退出动作则是它的析构类。 Greeting() { std::cout << "Hello World!/n" ; } // 进入

~Greeting() { std::cout << "Bye Bye World!/n" ; } // 退出

};

int main()

{

Machine myMachine;

// 构造完状态机后,它并未开始运行。我们要通过调用它的initiate()来启动它。

// 同时,它也将触发它的初始状态(Greeting)的构造。

myMachine.initiate();

// 当我们离开main()函数时,myMachine将被销毁,这将导致它销毁它内部的所有活动的状态类。

// (译者注:为什么会说所有?这是因为一个状态机可以同时 保持在多个状态中,可以参考“高级主题”部分)

return ;

}

这个程序会显示“Hello World!”和“ Bye Bye World! ”,然后退出

http://blog.csdn.net/karl_max/article/details/2879088上面有学习boost状态机三部曲

&period;NET中的状态机库Stateless

标题:.NET中的状态机库Stateless 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10674018.html 介绍 什么是状态机和状态模式 ...

boost解析XML方法教程

boost库在解析XML时具有良好的性能,可操作性也很强下地址有个简单的说明 http://blog.csdn.net/luopeiyuan1990/article/details/9445691 一 ...

JMeter压力测试及服务器状态监控教程

转载自:https://blog.csdn.net/cbzcbzcbzcbz/article/details/78023327 前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主 ...

Boost C&plus;&plus; 库 中文教程&lpar;全&rpar;

Boost C++ 库 目录 第 1 章 简介 第 2 章 智能指针 第 3 章 函数对象 第 4 章 事件处理 第 5 章 字符串处理 第 6 章 多线程 第 7 章 异步输入输出 第 8 章 进程 ...

boost库的安装&comma;使用&comma;介绍&comma;库分类

1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...

boost库的使用

我的经验:在强调运行效率的场合:shared_ptr/weak_ptr很好用,尤其是weak_ptr这个能够判断一个对象的生命周期的玩意,可以简化和扩展很多设计.unordered系列的容器也很不错. ...

Boost学习-Linuxidc上的很好的学习资料

来自 http://www.linuxidc.com/Linux/2011-07/39215.htm,拷贝第一页如下 Boost学习系列 简介及基本用法 [日期:2011-07-25] 来源:Linu ...

DotNet 资源大全

awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. https://github.com/jobb ...

随机推荐

MVC项目使用easyui的filebox控件上传文件

开发环境:WIN10+IE11,浏览器请使用IE10或以上版本 开发技术框架MVC4+JQuery Easyui+knockoutjs 效果为弹出小窗体,如下图 1.前端cshtml文件代码(只包含文 ...

Linux安全之——Ubuntu的iptable命令使用

设置开机自动启动iptables # sysv-rc-conf --level 2345 iptables on 列出当前iptables的策略和规则 # iptables -L -n 允许已经建立的 ...

Unity3D 的摄像机

什么是摄像机 Unity3D中,摄像机是一个非常非常重要的组件. 他的作用就是:将你设计的场景投影到设备的屏幕上. 摄像机的属性 1 clear flags 确定屏幕的哪一部分将被清除. 每个摄像机在 ...

A session had already been started - ignoring session&lowbar;start&lpar;&rpar; 解决方法

A session had already been started - ignoring session_start() --已经存在一个session 打开了 -- 忽略sessioon_star ...

《OD学hadoop》第三周0710

一.分布式集群安装1. Hadoop模式本地模式.伪分布模式.集群模式datanode 使用的机器上的磁盘,存储空间nodemanager使用的机器上的内存和CPU(计算和分析数据) 2. 搭建环境准 ...

linux&sol;unix运行级别

在SYSTEM V 风格的UNIX系统中,系统被分为不同的运行级别,这和BSD分支的UNIX有所不同,常用的为0~6七个级别:0关机 1单用户 2不带网络的多用户 3带网络的多用户 4保留,用户可以自 ...

js学习日记 (1)createDocumentFragment() ES6 &equals;&gt&semi; 箭头

只能说是会用和记载,深入理解还需时间. 有关性能优化: 使用createdocumentfragment()方法可以创建某个具有节点该有的所有属性的节点. 使用情况:  提取文档中的某个小部分,修改文 ...

bzoj2876 &lbrack;NOI2012&rsqb;骑行川藏(拉格朗日乘数法)

题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...

安卓onTextChanged参数解释及实现EditText字数监听 Editable使用

原作者部分修改部分 补充部分 补充部分2 补充部分3 补充部分4 Editable 尊重原作者:此篇文章是借鉴原作者地址 的博文 并进行修改和增加补充说明,我只是补充和修改: 我感觉这篇文章经过我的补 ...

C&num; 方法参数 out、ref、param 详解

ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为 ref/out形式.两者都可以使函数传回多个结果. ref 类似于 PH ...

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

歆格

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值