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! ”,然后退出。

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

32

33

34



35

36

37

38



39

40

41

42

43

44

45

46
