boost 有限状态机(FSM)

下载boost库 (boost_1_55_0 本文使用版本)

下载地址:http://c9.yunpan.360.cn/my/?sid=#%2F%E5%8D%9A%E5%AE%A2%E8%B5%84%E6%BA%90%2F

添加到应用项目中,通过项目属性 配置好库目录  (路径根据具体情况进行配置,主要看你放在项目的哪个路径下)



编码开始了:


#include "stdafx.h"
#include 

#include "boost/statechart/state_machine.hpp"     // 注意使用 " " , 如果 < > 报错
#include "boost/statechart/simple_state.hpp"

namespace sc = boost::statechart;

struct Greeting;

/*
boost::statechart 大量应用模板模式。 派生类必须将自己作为基类模板的第一个参数。
状态机必须知道当其初始化后进行的第一个状态。 这里将 Greeting 定义为其进入后的第一个状态。
state_machine
*/
struct Machine : sc::state_machine< Machine, Greeting > { };

/*
对于每一个状态,我们需要为其指明:它属于哪一个状态机  simple_state<> 指定
*/
struct Greeting : sc::simple_state< Greeting, Machine >
{
	/*
	状态机进入一个状态,就会创建一个相应的该状态的对象 (Constructor)。
	保持当前状态,这个对象才会一直存在。 状态机离开该状态时,对象被销毁 (Destructor)。
	*/
	Greeting() { std::cout<<"Greeting Constructor !\n"; }
	~Greeting() { std::cout<<"Greeting Destructor !"<




FSM(有限状态机) 的简单使用示例代码 

#include "stdafx.h"
#include 
#include 

#include "boost/statechart/state_machine.hpp"
#include "boost/statechart/simple_state.hpp"
#include "boost/statechart/transition.hpp"
#include "boost/statechart/event.hpp"

namespace sc = boost::statechart;

//定义事件    《根据事件 切换 状态》
class EvtStartStop : public sc::event< EvtStartStop > {};
class EvtReset : public sc::event< EvtReset > {};
class EvtGo : public sc::event< EvtGo > {};

class MainState;
class StopState;
class RunState;
class TwoState;

//定义状态机                             初始化状态 MainState
class Machine : public sc::state_machine< Machine, MainState > {};  

//定义 MainState 状态 , 它属于Machine, 它的子状态为 StopState
class MainState : public sc::simple_state< MainState, Machine, StopState >
{
public:
    typedef sc::transition< EvtReset, MainState > reactReset;	//状态切换
    typedef sc::transition< EvtGo, TwoState > reactGo;			//状态切换

    typedef boost::mpl::list< reactReset, reactGo > reactions;  //reactions 切不可拼写错误
	//一个状态可以定义任意数量的动作。这就是为什么当多于一个时,我们不得不将它们放到一个mpl::list<> 里。

    MainState(void)
	{
        std::cout<<"Enter MainState"<
{
public:
    typedef sc::transition< EvtGo, MainState > reactions; //状态切换

    TwoState(void)
	{
        std::cout<<"Enter TwoState"<
{
public:
    typedef sc::transition< EvtStartStop, RunState > reactions; //状态切换

    StopState(void)
	{
        std::cout<<"Enter StopState"<
{
public:
    typedef sc::transition< EvtStartStop, StopState > reactions;
    RunState(void)
	{
        std::cout<<"Enter RunState"<().mTime += std::difftime(std::time(0), mStartTime);
    }

    std::time_t mStartTime;
};


int _tmain(int argc, _TCHAR* argv[])
{
    Machine mc;
    mc.initiate();

    mc.process_event(EvtStartStop());
	std::cout<


 
   
  




你可能感兴趣的:(C++)