原文:The Boost Statechart Library
譯者:penghuster
簡介
Boost 狀態(tài)圖庫是一個(gè)無需代碼生成器就可以快速轉(zhuǎn)換 UML 狀態(tài)圖表偽可執(zhí)行的 C++ 代碼框架径荔。由于幾乎支持所有 UML的特性直接轉(zhuǎn)換猖凛,故所產(chǎn)生的C++代碼十分接近于狀態(tài)表的原文文字描述。
如何閱讀此教程
該教程內(nèi)容設(shè)計(jì)為逐步深入。讀者可以從合適位置開始讀遇绞,直到對(duì)于解決你的任務(wù)為止。特別地:
- 首先坐梯,僅僅有少數(shù)幾個(gè)狀態(tài)的簡單狀態(tài)機(jī)能夠通過以下描述合理地實(shí)現(xiàn)喷舀,基本主題:秒表
- 其次,達(dá)到12個(gè)狀態(tài)的大型狀態(tài)機(jī)請(qǐng)參照以下文章:進(jìn)階主題:數(shù)碼相機(jī)應(yīng)該是很有幫助的淋肾。
- 最后硫麻,用戶想要?jiǎng)?chuàng)建更加復(fù)雜的狀態(tài)機(jī),請(qǐng)參照:高級(jí)主題部分樊卓。另外拿愧,強(qiáng)烈建議閱讀限制條件章節(jié)。
hello world
我們將用一個(gè)最簡單的程序開始第一步碌尔,以下為狀態(tài)表:
該狀態(tài)圖的實(shí)現(xiàn)代碼如下:
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <iostream>
namespace sc = boost::statechart;
// 此處定義為strcut 是為了避免所有成員都要添加 public關(guān)鍵字浇辜,如果你不介意,也可以使用class唾戚。
// 我們需要提前申明初始化狀態(tài)柳洋,因?yàn)槠浔仨氃诙x狀態(tài)機(jī)的地方定義。
struct Greeting;
// Boost.Statechart 重度使用模板叹坦。子類必須總是將該初始化狀態(tài)作為第一參數(shù)傳遞給基類
// 當(dāng)狀態(tài)機(jī)進(jìn)行初始化時(shí)熊镣,必須被通知進(jìn)入哪個(gè)狀態(tài)這就是為什么 Greeting 作為第二個(gè)參數(shù)傳遞的原因。
struct Machine : sc::state_machine< Machine, Greeting > {};
//對(duì)于每個(gè)狀態(tài)都必須指定其所屬狀態(tài)機(jī)以及其在狀態(tài)表中的位置募书,
//兩者是通過simple_state<>的參數(shù)來指定绪囱。
//因?yàn)槲覀儞碛泻唵蔚臓顟B(tài)機(jī),故其上下文也是狀態(tài)機(jī)莹捡。
//相應(yīng)的鬼吵,Machine 被當(dāng)作上下文作為第二參數(shù)傳遞(上下文參數(shù)在下文將會(huì)進(jìn)一步說明)。
struct Greeting : sc::simple_state< Greeting, Machine >
{
// 不論何時(shí)狀態(tài)機(jī)進(jìn)入一個(gè)狀態(tài)道盏,就會(huì)創(chuàng)建一個(gè)相應(yīng)的狀態(tài)類的對(duì)象而柑。
//該對(duì)象將保持只要該狀態(tài)機(jī)保持在此狀態(tài)。最后荷逞,在此狀態(tài)結(jié)束時(shí)該對(duì)象將銷毀媒咳。
//因此,進(jìn)入動(dòng)作通過定義構(gòu)造函數(shù)來完成种远,出口動(dòng)作通過定義析構(gòu)函數(shù)來實(shí)現(xiàn)涩澡。
Greeting() { std::cout << "Hello World!\n"; } // entry
~Greeting() { std::cout << "Bye Bye World!\n"; } // exit
};
int main()
{
Machine myMachine;
// myMachine 在構(gòu)造函數(shù)調(diào)用后并沒有運(yùn)行,我們需要通過調(diào)用 initiate() 運(yùn)行該狀態(tài)機(jī)坠敷,
//這將觸發(fā) 初始狀態(tài) Greeting 的構(gòu)造
myMachine.initiate();
// 當(dāng)離開 main()時(shí)妙同,myMachine 的析構(gòu)將導(dǎo)致當(dāng)前激活狀態(tài)被析構(gòu)
return 0;
}
執(zhí)行此程序輸出 Hello World! 和 Bye Bye World!射富。