jack-wang
小王
C++博客
首页
新随笔
联系
聚合
管理
随笔-369 评论-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
小王
阅读(1703)
评论(0)
编辑
收藏
引用
所属分类:
Boost
只有注册用户
登录
后才能发表评论。
相关文章:
boost编译(Windows平台)
编译boost1.54
模板元编程 --- 用 MPL 解决实际问题
Boost的状态机库教程 补充
Boost的状态机库教程(3)
Boost的状态机库教程(2)
Boost的状态机库教程(1)
vc7编译boost 1.33.1记录(转)
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
<
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)
给我留言
查看公开留言
查看私人留言
随笔分类
(431)
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(5)
GO(1)
IE(1)
iOS(1)
Java(19)
JPA(2)
LibTorch(1)
linux(96)
MQTT(2)
node.js(3)
OpenGL(2)
Python(12)
Qt(7)
Redis(5)
ROS(4)
SpringBoot(4)
TensorRT(3)
UI(5)
Unreal Engine(1)
VC(44)
VLC(2)
Web开发(12)
Win32(4)
编译(32)
操作系统(3)
调试(2)
多核编程(3)
分布式系统(4)
汇编(1)
脚本(1)
开源项目(3)
其他(16)
嵌入式(1)
软件工程(5)
设计模式(7)
算法与数据结构(1)
网络通讯(17)
音视频(7)
游戏服务器端开发(17)
游戏引擎(7)
随笔档案
(369)
2024年4月 (3)
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. 在CANN推理程序中,执行aclmdlExecute()函数失败。 返回错误码:507011
2. 导入ffmpeg头文件,编译报错:undefined reference to `avformat_open_input,,,
3. 编译安装ffmpeg后,代码中include ffmpeg头文件,报错找不到此头文件
4. 编译安装opencv4之后,代码中#include
报错:No such file or directory
5. openEuler重启网络命令
6. 新安装的Ubuntu22中无法apt安装软件,报错:Failed to fetch http://cn.archive.ubuntu.com/,,,,,,
7. x86服务器下执行arm64程序报错:/lib64/ld-linux-aarch64.so.1: No such file or directory
8. 编译配置ffmpeg报错:ERROR: x264 not found using pkg-config
9. Linux中编译OpenCV(带contrib)
10. 海康摄像机的RTSP视频流地址
搜索
最新随笔
1. 在CANN推理程序中,执行aclmdlExecute()函数失败。 返回错误码:507011
2. 导入ffmpeg头文件,编译报错:undefined reference to `avformat_open_input,,,
3. 编译安装ffmpeg后,代码中include ffmpeg头文件,报错找不到此头文件
4. 编译安装opencv4之后,代码中#include
报错:No such file or directory
5. openEuler重启网络命令
6. 新安装的Ubuntu22中无法apt安装软件,报错:Failed to fetch http://cn.archive.ubuntu.com/,,,,,,
7. x86服务器下执行arm64程序报错:/lib64/ld-linux-aarch64.so.1: No such file or directory
8. 编译配置ffmpeg报错:ERROR: x264 not found using pkg-config
9. Linux中编译OpenCV(带contrib)
10. 海康摄像机的RTSP视频流地址
最新评论
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使用方法(9331)
2. 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](8533)
3. 执行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(8354)
4. 编译cmake报错:Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.(7108)
5. 把python3的版本从3.6升级到3.10(6361)
评论排行榜
1. Ubuntu9.10 VI下方向键变成ABCD的解决办法(3)
2. 公司散伙啦。杯具!反思!(3)
3. 网游服务器通信架构的设计(3)
4. 服务器宕机(2)
5. 没有找到MSVCR90.dll,因此这个应用程序未能启动,重新安装应用程序可能会修复此问题(2)
60天内阅读排行
1. 编译grpc报错:Package 'libsystemd', required by 'virtual:world', not found(717)
2. 编译报错:/lib/../lib64/crt1.o:在函数‘_start’中(.text+0x20)对‘main’未定义的引用 collect2: error: ld returned 1exit status(608)
3. openEuler重启网络命令(600)
4. x86服务器下执行arm64程序报错:/lib64/ld-linux-aarch64.so.1: No such file or directory(37)
5. 编译配置ffmpeg报错:ERROR: x264 not found using pkg-config(30)