jack-wang
小王
C++博客
首页
新随笔
联系
聚合
管理
随笔-379 评论-37 文章-0 trackbacks-0
Boost的状态机库教程(1)
转:
http://www.cppblog.com/shaker/archive/2010/08/16/123597.html
介绍
Boost状态机库一个应用程序框架,你可以用它将UML状态图快速的转换为可执行的c++代码,而不需要任何的代码生成器。它支持几乎所有的UML特征,可以直接了当的转换,并且转换后的c++代码就像对状态机进行一次文本描述一样具体可读性。
如何阅读这个教程
这个教程是以线性阅读的方式进行的章节设计。如果你是第一次看这个教程的话,你可以从头开始读,到你觉得了解的东西对你手头的任务来说已经足够时就停止。具体可以这样:
* 如果你的任务是要实现一个小的、简单的,并且有很少几个状态的状态机,那么下面的“初级主题:秒表”里所讲的就差不多够你用的了。
* 如果你要做一个有很多状态的大型状态机,你可以看一下“中级主题:数码相机”,那里的讲解可能对你有帮助。
* 最后,如果你是一个要创建异常复杂状态机的用户,或者是一个想要评估一个Boost状态机的设计师的话,你就要看一下“高级主题”部分。并且,我还强烈建议你看一下Rationle里的Limitions部分。
Hello World!
我们将要从一个最简单程序开始我们的第一步,状态图如下:
对于这个状态图,我们的实现代码如下:
1
#include
<
boost
/
statechart
/
state_machine.hpp
>
2
#include
<
boost
/
statechart
/
simple_state.hpp
>
3
#include
<
iostream
>
4
5
namespace
sc
=
boost::statechart;
6
7
//
为了避免写public,下面声明的类型全部为struct。
8
//
如果你不在乎的话可以把它们都改成class。
9
10
//
我们需要先声明一下初始状态,这是因为我们要在定义状态机时使用它
11
//
但又不得不在状态机这后定义它。
12
13
struct
Greeting;
14
15
//
Boost.Statechart大量应用模板模式。
16
//
派生类必须将自己做为基类模板的第一个参数。
17
//
18
//
状态机必须要知道当其初始化后进行的第一个状态。
19
//
这就是为什么Greeting要做为每二个模板参数。
20
//
(译者注:也就是说Greeting状态是Machine状态机初始化后进入的第一个状态)
21
struct
Machine : sc::state_machine
<
Machine, Greeting
>
{}
;
22
23
//
对于每一个状态,我们需要为其指明:它属于哪一个状态机,它位于状态图的哪个位置。
24
//
我们用simple_state<>的上下文参数就可以完成这些指定了。
25
//
对于我们目前的这个简单的状态机来说,上下文就是状态机(Machine)
26
//
所以,Machine必须要做为simple_state的第二个模块参数。
27
//
(关于上下文参数的详细解释在下一个例子中有)
28
struct
Greeting : sc::simple_state
<
Greeting, Machine
>
29
{
30
//
一旦状态机进行一个状态的时候,它就要创建一个相应状态类的对象(类实例)
31
//
只要状态机保持在这个状态下,这个对象就会一直存在。
32
//
最后,当状态机离开这个状态时,对象被销毁。
33
//
所以,一个状态的进入动作就是这个状态类的构造器,而它的退出动作则是它的析构类。 Greeting() { std::cout << "Hello World!\n" ; }
//
进入
34
~
Greeting()
{ std::cout
<<
"
Bye Bye World!\n
"
; }
//
退出
35
}
;
36
37
int
main()
38
{
39
Machine myMachine;
40
//
构造完状态机后,它并未开始运行。我们要通过调用它的initiate()来启动它。
41
//
同时,它也将触发它的初始状态(Greeting)的构造。
42
myMachine.initiate();
43
//
当我们离开main()函数时,myMachine将被销毁,这将导致它销毁它内部的所有活动的状态类。
44
//
(译者注:为什么会说所有?这是因为一个状态机可以同时
保持在多个状态中,可以参考“高级主题”部分)
45
return
0
;
46
}
这个程序会显示“
Hello World!”和“
Bye Bye World!
”,然后退出。
posted on 2010-10-03 19:06
小王
阅读(1755)
评论(0)
编辑
收藏
引用
所属分类:
Boost
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
boost编译(Windows平台)
编译boost1.54
模板元编程 --- 用 MPL 解决实际问题
Boost的状态机库教程 补充
Boost的状态机库教程(3)
Boost的状态机库教程(2)
Boost的状态机库教程(1)
vc7编译boost 1.33.1记录(转)
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2010年10月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(16)
给我留言
查看公开留言
查看私人留言
随笔分类
(441)
Android(7)
Boost(8)
C#
c++ 程序设计基础(11)
CMake(2)
Cocos2d-X(1)
CUDA(3)
DB(21)
DirectX(2)
Docker(5)
Dubbo(3)
Erlang(5)
Git(6)
GO(1)
IE(1)
iOS(1)
Java(19)
JPA(2)
LibTorch(1)
linux(99)
MQTT(2)
node.js(3)
OpenGL(2)
Python(15)
Qt(7)
Redis(5)
ROS(4)
SpringBoot(4)
TensorRT(3)
UI(5)
Unreal Engine(1)
VC(44)
VLC(2)
Web开发(12)
Win32(4)
编译(34)
操作系统(3)
调试(2)
多核编程(3)
分布式系统(4)
汇编(1)
脚本(1)
开源项目(3)
其他(16)
嵌入式(1)
软件工程(5)
瑞芯微(1)
设计模式(7)
算法与数据结构(1)
网络通讯(17)
音视频(7)
游戏服务器端开发(17)
游戏引擎(7)
随笔档案
(379)
2024年11月 (2)
2024年10月 (1)
2024年6月 (2)
2024年5月 (4)
2024年4月 (4)
2024年3月 (9)
2024年2月 (1)
2024年1月 (6)
2023年12月 (2)
2023年10月 (8)
2023年9月 (1)
2023年7月 (2)
2023年5月 (1)
2023年4月 (3)
2023年3月 (2)
2022年12月 (2)
2022年11月 (3)
2022年10月 (3)
2022年9月 (5)
2022年8月 (2)
2022年7月 (10)
2022年6月 (5)
2022年5月 (7)
2022年4月 (4)
2022年3月 (1)
2022年2月 (11)
2022年1月 (6)
2021年12月 (7)
2021年10月 (3)
2021年6月 (2)
2021年4月 (1)
2021年3月 (3)
2021年2月 (1)
2021年1月 (3)
2020年12月 (2)
2020年11月 (1)
2020年10月 (2)
2020年9月 (2)
2020年7月 (4)
2020年6月 (2)
2020年4月 (3)
2020年3月 (2)
2020年2月 (2)
2020年1月 (3)
2019年11月 (2)
2019年10月 (5)
2019年9月 (1)
2019年8月 (3)
2019年7月 (1)
2019年6月 (6)
2019年5月 (4)
2019年4月 (2)
2019年3月 (2)
2019年2月 (1)
2019年1月 (4)
2018年1月 (2)
2017年12月 (8)
2017年11月 (3)
2017年9月 (4)
2017年8月 (1)
2017年3月 (1)
2017年2月 (2)
2017年1月 (5)
2016年12月 (1)
2016年5月 (1)
2016年4月 (1)
2016年1月 (1)
2015年8月 (3)
2015年6月 (1)
2015年5月 (1)
2015年4月 (1)
2014年7月 (2)
2014年6月 (2)
2014年5月 (1)
2014年3月 (1)
2014年2月 (2)
2013年11月 (3)
2013年9月 (4)
2013年8月 (1)
2013年6月 (1)
2013年5月 (1)
2013年4月 (3)
2013年3月 (5)
2013年2月 (1)
2013年1月 (2)
2012年11月 (1)
2012年10月 (3)
2012年9月 (1)
2012年7月 (3)
2012年6月 (3)
2012年5月 (1)
2012年3月 (5)
2012年2月 (2)
2012年1月 (1)
2011年12月 (3)
2011年9月 (1)
2011年8月 (2)
2011年6月 (1)
2011年4月 (1)
2011年3月 (2)
2011年2月 (2)
2010年12月 (1)
2010年11月 (7)
2010年10月 (7)
2010年9月 (2)
2010年8月 (2)
2010年7月 (3)
2010年6月 (2)
2010年4月 (4)
2010年3月 (6)
2010年2月 (12)
2010年1月 (22)
2009年11月 (6)
2009年8月 (5)
2009年6月 (2)
2009年2月 (4)
2009年1月 (15)
2008年10月 (1)
Linux
chinaunix
游戏开发
金庆
云风
综合
Intel
λ-calculus
周伟明
最新随笔
1. dnf安装失败
2. RK3588设备中运行可执行程序报错:error while loading shared libraries: librknnrt.so: cannot open shared object file:
3. wget下载报错:The certificate of ‘www.python.org’ is not trusted.
4. 执行torch.load(模型名称, map_location='cpu')报错:from torchvision.transforms.functional_tensor import rgb_to_grayscale
5. pip安装basicsr报错:To fix this you could try to:
6. cmake文件中D_GLIBCXX_USE_CXX11_ABI=0,导致无法到入第三方库libjsoncpp.so
7. 链接libjsoncpp.a时报错:which may bind externally can not be used when making a shared object; recompile with -fPIC
8. vs code中git push代码报错:Missing or invalid credentials.
9. git clone报错:SSL certificate problem: self signed certificate in certificate chain
10. openEuler系统中修改系统时间
搜索
最新随笔
1. dnf安装失败
2. RK3588设备中运行可执行程序报错:error while loading shared libraries: librknnrt.so: cannot open shared object file:
3. wget下载报错:The certificate of ‘www.python.org’ is not trusted.
4. 执行torch.load(模型名称, map_location='cpu')报错:from torchvision.transforms.functional_tensor import rgb_to_grayscale
5. pip安装basicsr报错:To fix this you could try to:
6. cmake文件中D_GLIBCXX_USE_CXX11_ABI=0,导致无法到入第三方库libjsoncpp.so
7. 链接libjsoncpp.a时报错:which may bind externally can not be used when making a shared object; recompile with -fPIC
8. vs code中git push代码报错:Missing or invalid credentials.
9. git clone报错:SSL certificate problem: self signed certificate in certificate chain
10. openEuler系统中修改系统时间
最新评论
1. re: DirectUI Lib XML编写说明
这个不错,很有用。
--dictbox
2. re: MFC:为CListCtrl添加背景图片[未登录]
没用
--123
3. re: DirectUI Lib XML编写说明[未登录]
很好,对于我这样的初学者很用帮助,谢谢楼主
--king
4. re: WindowXP下PHP5开发环境配置
谢谢楼主分享,已经按楼主的方法配置成功
--bbreay
5. re: error C2220: 警告被视为错误 - 没有生成“object”文件
你好,我用的是vs2012,没有你说的“选择该cpp”,如:
--coco
阅读排行榜
1. protobuf使用方法(9372)
2. 执行pip install报错: WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv(8755)
3. 1>c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d](8579)
4. 编译cmake报错:Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.(7933)
5. 把python3的版本从3.6升级到3.10(6988)
评论排行榜
1. 网游服务器通信架构的设计(3)
2. 公司散伙啦。杯具!反思!(3)
3. Ubuntu9.10 VI下方向键变成ABCD的解决办法(3)
4. kosmix,又一个开源的类似GFS的分布式文件系统(2)
5. DirectUI Lib XML编写说明(2)