jack-wang
小王
C++博客
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-380 評(píng)論-37 文章-0 trackbacks-0
Boost的狀態(tài)機(jī)庫教程(1)
轉(zhuǎn):
http://www.shnenglu.com/shaker/archive/2010/08/16/123597.html
介紹
Boost狀態(tài)機(jī)庫一個(gè)應(yīng)用程序框架,你可以用它將UML狀態(tài)圖快速的轉(zhuǎn)換為可執(zhí)行的c++代碼,而不需要任何的代碼生成器。它支持幾乎所有的UML特征,可以直接了當(dāng)?shù)霓D(zhuǎn)換,并且轉(zhuǎn)換后的c++代碼就像對(duì)狀態(tài)機(jī)進(jìn)行一次文本描述一樣具體可讀性。
如何閱讀這個(gè)教程
這個(gè)教程是以線性閱讀的方式進(jìn)行的章節(jié)設(shè)計(jì)。如果你是第一次看這個(gè)教程的話,你可以從頭開始讀,到你覺得了解的東西對(duì)你手頭的任務(wù)來說已經(jīng)足夠時(shí)就停止。具體可以這樣:
* 如果你的任務(wù)是要實(shí)現(xiàn)一個(gè)小的、簡(jiǎn)單的,并且有很少幾個(gè)狀態(tài)的狀態(tài)機(jī),那么下面的“初級(jí)主題:秒表”里所講的就差不多夠你用的了。
* 如果你要做一個(gè)有很多狀態(tài)的大型狀態(tài)機(jī),你可以看一下“中級(jí)主題:數(shù)碼相機(jī)”,那里的講解可能對(duì)你有幫助。
* 最后,如果你是一個(gè)要?jiǎng)?chuàng)建異常復(fù)雜狀態(tài)機(jī)的用戶,或者是一個(gè)想要評(píng)估一個(gè)Boost狀態(tài)機(jī)的設(shè)計(jì)師的話,你就要看一下“高級(jí)主題”部分。并且,我還強(qiáng)烈建議你看一下Rationle里的Limitions部分。
Hello World!
我們將要從一個(gè)最簡(jiǎn)單程序開始我們的第一步,狀態(tài)圖如下:
對(duì)于這個(gè)狀態(tài)圖,我們的實(shí)現(xiàn)代碼如下:
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
//
我們需要先聲明一下初始狀態(tài),這是因?yàn)槲覀円诙x狀態(tài)機(jī)時(shí)使用它
11
//
但又不得不在狀態(tài)機(jī)這后定義它。
12
13
struct
Greeting;
14
15
//
Boost.Statechart大量應(yīng)用模板模式。
16
//
派生類必須將自己做為基類模板的第一個(gè)參數(shù)。
17
//
18
//
狀態(tài)機(jī)必須要知道當(dāng)其初始化后進(jìn)行的第一個(gè)狀態(tài)。
19
//
這就是為什么Greeting要做為每二個(gè)模板參數(shù)。
20
//
(譯者注:也就是說Greeting狀態(tài)是Machine狀態(tài)機(jī)初始化后進(jìn)入的第一個(gè)狀態(tài))
21
struct
Machine : sc::state_machine
<
Machine, Greeting
>
{}
;
22
23
//
對(duì)于每一個(gè)狀態(tài),我們需要為其指明:它屬于哪一個(gè)狀態(tài)機(jī),它位于狀態(tài)圖的哪個(gè)位置。
24
//
我們用simple_state<>的上下文參數(shù)就可以完成這些指定了。
25
//
對(duì)于我們目前的這個(gè)簡(jiǎn)單的狀態(tài)機(jī)來說,上下文就是狀態(tài)機(jī)(Machine)
26
//
所以,Machine必須要做為simple_state的第二個(gè)模塊參數(shù)。
27
//
(關(guān)于上下文參數(shù)的詳細(xì)解釋在下一個(gè)例子中有)
28
struct
Greeting : sc::simple_state
<
Greeting, Machine
>
29
{
30
//
一旦狀態(tài)機(jī)進(jìn)行一個(gè)狀態(tài)的時(shí)候,它就要?jiǎng)?chuàng)建一個(gè)相應(yīng)狀態(tài)類的對(duì)象(類實(shí)例)
31
//
只要狀態(tài)機(jī)保持在這個(gè)狀態(tài)下,這個(gè)對(duì)象就會(huì)一直存在。
32
//
最后,當(dāng)狀態(tài)機(jī)離開這個(gè)狀態(tài)時(shí),對(duì)象被銷毀。
33
//
所以,一個(gè)狀態(tài)的進(jìn)入動(dòng)作就是這個(gè)狀態(tài)類的構(gòu)造器,而它的退出動(dòng)作則是它的析構(gòu)類。 Greeting() { std::cout << "Hello World!\n" ; }
//
進(jìn)入
34
~
Greeting()
{ std::cout
<<
"
Bye Bye World!\n
"
; }
//
退出
35
}
;
36
37
int
main()
38
{
39
Machine myMachine;
40
//
構(gòu)造完?duì)顟B(tài)機(jī)后,它并未開始運(yùn)行。我們要通過調(diào)用它的initiate()來啟動(dòng)它。
41
//
同時(shí),它也將觸發(fā)它的初始狀態(tài)(Greeting)的構(gòu)造。
42
myMachine.initiate();
43
//
當(dāng)我們離開main()函數(shù)時(shí),myMachine將被銷毀,這將導(dǎo)致它銷毀它內(nèi)部的所有活動(dòng)的狀態(tài)類。
44
//
(譯者注:為什么會(huì)說所有?這是因?yàn)橐粋€(gè)狀態(tài)機(jī)可以同時(shí)
保持在多個(gè)狀態(tài)中,可以參考“高級(jí)主題”部分)
45
return
0
;
46
}
這個(gè)程序會(huì)顯示“
Hello World!”和“
Bye Bye World!
”,然后退出。
posted on 2010-10-03 19:06
小王
閱讀(1817)
評(píng)論(0)
編輯
收藏
引用
所屬分類:
Boost
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
boost編譯(Windows平臺(tái))
編譯boost1.54
模板元編程 --- 用 MPL 解決實(shí)際問題
Boost的狀態(tài)機(jī)庫教程 補(bǔ)充
Boost的狀態(tài)機(jī)庫教程(3)
Boost的狀態(tài)機(jī)庫教程(2)
Boost的狀態(tài)機(jī)庫教程(1)
vc7編譯boost 1.33.1記錄(轉(zhuǎn))
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
<
2010年1月
>
日
一
二
三
四
五
六
27
28
29
30
31
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
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(16)
給我留言
查看公開留言
查看私人留言
隨筆分類
(442)
Android(7)
Boost(8)
C#
c++ 程序設(shè)計(jì)基礎(chǔ)(11)
CMake(2)
Cocos2d-X(1)
CUDA(2)
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)
ROS2(1)
SpringBoot(4)
TensorRT(3)
UI(5)
Unreal Engine(1)
VC(44)
VLC(2)
Web開發(fā)(12)
Win32(4)
編譯(34)
操作系統(tǒng)(3)
調(diào)試(2)
多核編程(3)
分布式系統(tǒng)(4)
匯編(1)
腳本(1)
開源項(xiàng)目(3)
其他(16)
嵌入式(1)
軟件工程(5)
瑞芯微(1)
設(shè)計(jì)模式(7)
昇騰(1)
算法與數(shù)據(jù)結(jié)構(gòu)(1)
網(wǎng)絡(luò)通訊(17)
音視頻(7)
游戲服務(wù)器端開發(fā)(17)
游戲引擎(7)
隨筆檔案
(380)
2025年5月 (1)
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
游戲開發(fā)
金慶
云風(fēng)
綜合
Intel
λ-calculus
周偉明
最新隨筆
1.?ROS2開發(fā)環(huán)境搭建
2.?dnf安裝失敗
3.?RK3588設(shè)備中運(yùn)行可執(zhí)行程序報(bào)錯(cuò):error while loading shared libraries: librknnrt.so: cannot open shared object file:
4.?wget下載報(bào)錯(cuò):The certificate of ‘www.python.org’ is not trusted.
5.?執(zhí)行torch.load(模型名稱, map_location='cpu')報(bào)錯(cuò):from torchvision.transforms.functional_tensor import rgb_to_grayscale
6.?pip安裝basicsr報(bào)錯(cuò):To fix this you could try to:
7.?cmake文件中D_GLIBCXX_USE_CXX11_ABI=0,導(dǎo)致無法到入第三方庫libjsoncpp.so
8.?鏈接libjsoncpp.a時(shí)報(bào)錯(cuò):which may bind externally can not be used when making a shared object; recompile with -fPIC
9.?vs code中g(shù)it push代碼報(bào)錯(cuò):Missing or invalid credentials.
10.?git clone報(bào)錯(cuò):SSL certificate problem: self signed certificate in certificate chain
搜索
最新隨筆
1.?ROS2開發(fā)環(huán)境搭建
2.?dnf安裝失敗
3.?RK3588設(shè)備中運(yùn)行可執(zhí)行程序報(bào)錯(cuò):error while loading shared libraries: librknnrt.so: cannot open shared object file:
4.?wget下載報(bào)錯(cuò):The certificate of ‘www.python.org’ is not trusted.
5.?執(zhí)行torch.load(模型名稱, map_location='cpu')報(bào)錯(cuò):from torchvision.transforms.functional_tensor import rgb_to_grayscale
6.?pip安裝basicsr報(bào)錯(cuò):To fix this you could try to:
7.?cmake文件中D_GLIBCXX_USE_CXX11_ABI=0,導(dǎo)致無法到入第三方庫libjsoncpp.so
8.?鏈接libjsoncpp.a時(shí)報(bào)錯(cuò):which may bind externally can not be used when making a shared object; recompile with -fPIC
9.?vs code中g(shù)it push代碼報(bào)錯(cuò):Missing or invalid credentials.
10.?git clone報(bào)錯(cuò):SSL certificate problem: self signed certificate in certificate chain
最新評(píng)論
1.?re: DirectUI Lib XML編寫說明
這個(gè)不錯(cuò),很有用。
--dictbox
2.?re: MFC:為CListCtrl添加背景圖片[未登錄]
沒用
--123
3.?re: DirectUI Lib XML編寫說明[未登錄]
很好,對(duì)于我這樣的初學(xué)者很用幫助,謝謝樓主
--king
4.?re: WindowXP下PHP5開發(fā)環(huán)境配置
謝謝樓主分享,已經(jīng)按樓主的方法配置成功
--bbreay
5.?re: error C2220: 警告被視為錯(cuò)誤 - 沒有生成“object”文件
你好,我用的是vs2012,沒有你說的“選擇該cpp”,如:
--coco
閱讀排行榜
1.?protobuf使用方法(9447)
2.?執(zhí)行pip install報(bào)錯(cuò): 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(9059)
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](8671)
4.?編譯cmake報(bào)錯(cuò):Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.(8351)
5.?把python3的版本從3.6升級(jí)到3.10(7409)
評(píng)論排行榜
1.?網(wǎng)游服務(wù)器通信架構(gòu)的設(shè)計(jì)(3)
2.?公司散伙啦。杯具!反思!(3)
3.?Ubuntu9.10 VI下方向鍵變成ABCD的解決辦法(3)
4.?kosmix,又一個(gè)開源的類似GFS的分布式文件系統(tǒng)(2)
5.?服務(wù)器宕機(jī)(2)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 小王
亚洲精品高清久久
|
久久九九兔免费精品6
|
情人伊人久久综合亚洲
|
91亚洲国产成人久久精品网址
|
久久精品国产99国产精品澳门
|
囯产精品久久久久久久久蜜桃
|
久久香蕉国产线看观看乱码
|
久久久久人妻一区精品果冻
|
婷婷五月深深久久精品
|
一本久久a久久精品综合夜夜
|
久久只有这精品99
|
国产欧美一区二区久久
|
久久久久亚洲AV片无码下载蜜桃
|
久久国产亚洲精品无码
|
久久久久久亚洲精品影院
|
久久精品国产91久久麻豆自制
|
久久久久亚洲AV成人网人人网站
|
精品久久久久久综合日本
|
亚洲国产成人乱码精品女人久久久不卡
|
国产精品免费久久久久电影网
|
亚洲乱码中文字幕久久孕妇黑人
|
久久99精品国产麻豆蜜芽
|
av午夜福利一片免费看久久
|
久久久久久久久久久精品尤物
|
国产综合免费精品久久久
|
99久久99这里只有免费的精品
|
成人国内精品久久久久一区
|
色天使久久综合网天天
|
久久99精品国产麻豆不卡
|
久久无码av三级
|
一本一道久久精品综合
|
久久香蕉一级毛片
|
亚洲国产精品久久久久婷婷老年
|
久久国产亚洲精品麻豆
|
久久久国产精品福利免费
|
国产精品99久久免费观看
|
久久er99热精品一区二区
|
久久亚洲欧美国产精品
|
久久99精品国产麻豆
|
成人妇女免费播放久久久
|
97热久久免费频精品99
|