Boost的狀態機庫教程(1)



介紹
    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. struct  Greeting; 
  13.  
  14. // Boost.Statechart大量應用模板模式。
  15. // 派生類必須將自己做爲基類模板的第一個參數。
  16. // 
  17. // 狀態機必須要知道當其初始化後進行的第一個狀態。
  18. // 這就是爲什麼Greeting要做爲每二個模板參數。
  19. // (譯者注:也就是說Greeting狀態是Machine狀態機初始化後進入的第一個狀態)
  20. struct  Machine : sc::state_machine< Machine, Greeting > {}; 
  21.  
  22. // 對於每一個狀態,我們需要爲其指明:它屬於哪一個狀態機,它位於狀態圖的哪個位置。
  23. // 我們用simple_state<>的上下文參數就可以完成這些指定了。
  24. // 對於我們目前的這個簡單的狀態機來說,上下文就是狀態機(Machine)
  25. // 所以,Machine必須要做爲simple_state的第二個模塊參數。
  26. // (關於上下文參數的詳細解釋在下一個例子中有)
  27. struct  Greeting : sc::simple_state< Greeting, Machine > 
  28.    // 一旦狀態機進行一個狀態的時候,它就要創建一個相應狀態類的對象(類實例)
  29.   // 只要狀態機保持在這個狀態下,這個對象就會一直存在。        
  30.   // 最後,當狀態機離開這個狀態時,對象被銷燬。
  31.   // 所以,一個狀態的進入動作就是這個狀態類的構造器,而它的退出動作則是它的析構類。   Greeting() { std::cout <<  "Hello World!/n" ; }  // 進入
  32.   ~Greeting() { std::cout <<  "Bye Bye World!/n" ; }  // 退出
  33. }; 
  34.  
  35. int  main() 
  36.   Machine myMachine; 
  37.    // 構造完狀態機後,它並未開始運行。我們要通過調用它的initiate()來啓動它。
  38.    // 同時,它也將觸發它的初始狀態(Greeting)的構造。
  39.   myMachine.initiate(); 
  40.    // 當我們離開main()函數時,myMachine將被銷燬,這將導致它銷燬它內部的所有活動的狀態類。
  41.    // (譯者注:爲什麼會說所有?這是因爲一個狀態機可以同時 <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script> <script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> 保持在多個狀態中,可以參考“高級主題”部分)
  42.    return  0; 
  43. }

這個程序會顯示“Hello World!”和“ Bye Bye World! ”,然後退出。

(未完待續)

發佈了46 篇原創文章 · 獲贊 4 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章