boost 里面有状态机了_Boost的状态机库教程(1)

这篇教程介绍了如何利用Boost状态机库将UML状态图转换为可执行的C++代码,无需代码生成器。适合不同复杂度的状态机实现,包括简单的秒表、复杂的数码相机状态机等。通过示例展示了如何定义和操作状态,以及如何在程序中启动和关闭状态机。示例程序展示了状态的进入和退出行为,输出'HelloWorld!'和'ByeByeWorld!'。
摘要由CSDN通过智能技术生成

介绍

Boost状态机库一个应用程序框架,你可以用它将UML状态图快速的转换为可执行的c++代码,而不需要任何的代码生成器。它支持几乎所有的UML特征,可以直接了当的转换,并且转换后的c++代码就像对状态机进行一次文本描述一样具体可读性。

如何阅读这个教程

这个教程是以线性阅读的方式进行的章节设计。如果你是第一次看这个教程的话,你可以从头开始读,到你觉得了解的东西对你手头的任务来说已经足够时就停止。具体可以这样:*如果你的任务是要实现一个小的、简单的,并且有很少几个状态的状态机,那么下面的“初级主题:秒表”里所讲的就差不多够你用的了。*如果你要做一个有很多状态的大型状态机,你可以看一下“中级主题:数码相机”,那里的讲解可能对你有帮助。*最后,如果你是一个要创建异常复杂状态机的用户,或者是一个想要评估一个Boost状态机的设计师的话,你就要看一下“高级主题”部分。并且,我还强烈建议你看一下Rationle里的Limitions部分。

Hello World!我们将要从一个最简单程序开始我们的第一步,状态图如下:

对于这个状态图,我们的实现代码如下:

#include#include#include

namespace sc =boost::statechart;//为了避免写public,下面声明的类型全部为struct。//如果你不在乎的话可以把它们都改成class。//我们需要先声明一下初始状态,这是因为我们要在定义状态机时使用它//但又不得不在状态机这后定义它。

structGreeting;//Boost.Statechart大量应用模板模式。//派生类必须将自己做为基类模板的第一个参数。//

//状态机必须要知道当其初始化后进行的第一个状态。//这就是为什么Greeting要做为每二个模板参数。//(译者注:也就是说Greeting状态是Machine状态机初始化后进入的第一个状态)

struct Machine : sc::state_machine< Machine, Greeting >{};//对于每一个状态,我们需要为其指明:它属于哪一个状态机,它位于状态图的哪个位置。//我们用simple_state<>的上下文参数就可以完成这些指定了。//对于我们目前的这个简单的状态机来说,上下文就是状态机(Machine)//所以,Machine必须要做为simple_state的第二个模块参数。//(关于上下文参数的详细解释在下一个例子中有)

struct Greeting : sc::simple_state< Greeting, Machine >{//一旦状态机进行一个状态的时候,它就要创建一个相应状态类的对象(类实例)//只要状态机保持在这个状态下,这个对象就会一直存在。//最后,当状态机离开这个状态时,对象被销毁。//所以,一个状态的进入动作就是这个状态类的构造器,而它的退出动作则是它的析构类。 Greeting() { std::cout << "Hello World!/n" ; }//进入

~Greeting() { std::cout << "Bye Bye World!/n" ; } //退出

};intmain()

{

Machine myMachine;//构造完状态机后,它并未开始运行。我们要通过调用它的initiate()来启动它。//同时,它也将触发它的初始状态(Greeting)的构造。

myMachine.initiate();//当我们离开main()函数时,myMachine将被销毁,这将导致它销毁它内部的所有活动的状态类。//(译者注:为什么会说所有?这是因为一个状态机可以同时 保持在多个状态中,可以参考“高级主题”部分)

return 0;

}

这个程序会显示“Hello World!”和“ Bye Bye World! ”,然后退出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值