повысить МСМ класс?

Я новичок в повышении МСМ и повышении в целом. Я хотел бы как-то инкапсулировать все:

  • структуры событий
  • структура 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                                           >
    > {};

};

person Kam    schedule 05.06.2012    source источник
comment
Что вы подразумеваете под инкапсуляцией?   -  person pmr    schedule 05.06.2012
comment
Я хотел бы поместить вышеуказанные структуры в класс и иметь заголовочный файл, который я могу добавить всем, кто хочет использовать конечный автомат.   -  person Kam    schedule 05.06.2012
comment
Я сбит с толку. Приведенная выше структура уже является классом (struct) и я не вижу ничего, что мешало бы вам вынести ее в заголовочный файл.   -  person pmr    schedule 05.06.2012
comment
Я пытаюсь избежать реализации методов on_entry/on_exit в файле .h.   -  person Kam    schedule 05.06.2012
comment
Таким образом, вы, по сути, спрашиваете, как вы можете реализовать элемент вложенной структуры в файле реализации?   -  person pmr    schedule 05.06.2012
comment
Да точно, спасибо за разъяснение вопроса   -  person Kam    schedule 05.06.2012


Ответы (2)


Чтобы реализовать член вложенного использования:

// header file
struct Foo {
  struct Nested {
    void mem();
  };
};
// cpp file
void Foo::Nested::mem() {
  // implementation goes here
}
person pmr    schedule 05.06.2012

Я получил этот вопрос не так давно. Если вы объявите вложенную структуру 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_>{};

ХТХ, Кристоф

person Christophe Henry    schedule 06.06.2012
comment
Просто интересно, не будет ли эта проблема решена с помощью #ifndef #define вокруг файла заголовка, чтобы компилятор мог сканировать его только один раз? - person Kam; 07.06.2012
comment
нет, потому что это не решит проблему разных единиц перевода, включая этот заголовок. Для каждого из них вам нужно будет заплатить стоимость времени компиляции. - person Christophe Henry; 07.06.2012