0

我是新手来提升 msm 和提升一般。我想以某种方式封装所有:

  • 事件结构
  • stateMahine 结构包含转换表结构和状态结构

一个类内。

我怎样才能做到这一点?

// events
struct event1 {};



// front-end: define the FSM structure 
struct my_machine_ : public msm::front::state_machine_def<my_machine_>
{
    // The list of FSM states
    struct State1 : public msm::front::state<> 
    {
        // every (optional) entry/exit methods get the event passed.
        template <class Event,class FSM>
        void on_entry(Event const&,FSM& ) {std::cout << "entering: State1" << std::endl;}
        template <class Event,class FSM>
        void on_exit(Event const&,FSM& ) {std::cout << "leaving: State1" << std::endl;}
    };

    struct State2 : public msm::front::state<> 
    { 
        template <class Event,class FSM>
        void on_entry(Event const& ,FSM&) {std::cout << "entering: State3" << std::endl;}
        template <class Event,class FSM>
        void on_exit(Event const&,FSM& ) {std::cout << "leaving: State3" << std::endl;}


    };

    // the initial state of the player SM. Must be defined
    typedef State1 initial_state;

    typedef my_machine_ p; // makes transition table cleaner

    // Transition table
    struct transition_table : mpl::vector<
        //    Start     Event         Next      Action               Guard
        //  +---------+-------------+---------+---------------------+----------------------+
        Row < State1  , event1      , State2                                               >,
        Row < State2  , event1      , State1                                           >
    > {};

};
4

2 回答 2

1

要实现嵌套使用的成员:

// header file
struct Foo {
  struct Nested {
    void mem();
  };
};
// cpp file
void Foo::Nested::mem() {
  // implementation goes here
}
于 2012-06-05T15:11:49.630 回答
1

不久前我收到了这个问题。如果您在头文件中声明嵌套的 Fsm 结构,您将支付更高的编译时间,无论包含在哪里。另一种选择是:

// PublicClass.hpp
struct PublicClass
{
  // forward-declare nested type. This will inherit msm::back::state_machine<...>
  struct Fsm;
  // with shared_ptr, you don't need the complete type yet.
  boost::shared_ptr<Fsm> fsm_;
};

// PublicClass.cpp
// provide definition of Fsm.
struct PublicClass::Fsm : public msm::back::state_machine<my_machine_>{};

HTH,克里斯托夫

于 2012-06-06T21:49:18.503 回答