Как реализовать & quot; BaseState & quot; с доступом к задней / передней части конечного автомата (SM) в boost :: msm

Я хочу обмениваться данными и доступом между состояниями, а также SM в целом и кодом клиента (т.е. кодом вне SM).

Исходя из того, что я придумал в сети, лучшим способом было бы унаследовать все состояния от базового класса.

Добавление базового класса и создание всех состояний & унаследовать SM от этого просто, но как я могу добавить обработчик в бэкэнд / внешний интерфейс SM как член этого базового класса и как его инициализировать?

это образец кода компилируется, но вылетает при доступе к fsmHandler, установленному в SubState (SubState обычно не имеет доступа к корневому fsm)!

Вопросы:

Как я могу получить доступ к root-SM и его данным в автоматах в глубине SM-иерархии?

Q1) Как я могу решить ошибку во время выполнения?

Q2) То, как я передаю данные из клиентского кода (вне SM) в SM, не кажется правильным! Есть ли лучший способ сделать это? Это потокобезопасно?

Q3) Как я могу сделать typedef StateBase_<MyFsm_> StateBase компиляции.

Я был бы очень признателен, если бы вы могли предоставить рабочий образец.
Спасибо за ваше время & помогите заранее.

Код:

main.cpp

int main()
{
std::cout << "Testing boost::msm ..." << std::endl;
MyFsm fsm;
fsm.start();

MyFsm::State1& tempState = fsm.get_state<MyFsm::State1&>();
fsm.m_outerSMData=77;
tempState.m_fsmHandler = &fsm;fsm.process_event(Event1());
fsm.process_event(Event2());
}

myfsm.h

namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;

struct Event1{};
struct Event2{};

template<class Fsm>
struct StateBase_{
//StateBase(Fsm *fsm):m_fsm(fsm){}
StateBase_(){}
~StateBase_(){}

Fsm *m_fsmHandler;
};

//typedef StateBase_<MyFsm_> StateBase;//How can I make this typedef work?

struct MyFsm_ : msmf::state_machine_def<MyFsm_, StateBase_<MyFsm_> >
{
struct State1 : msmf::state<StateBase_<MyFsm_>>{
template<class Event, class Fsm> void on_entry(const Event&, Fsm&) const {std::cout << "State1::on_entry()" << std::endl;}
template<class Event, class Fsm> void on_exit(const Event&, Fsm&) const {std::cout << "State1::on_exit()" << std::endl;}
};

struct State2_ : msmf::state_machine_def<State2_, StateBase_>{
template<class Event, class Fsm> void on_entry(const Event&, Fsm&) const {std::cout << "State2::on_entry()" << std::endl;}
template<class Event, class Fsm> void on_exit(const Event&, Fsm&) const {std::cout << "State2::on_exit()" << std::endl;}

struct SubState21 : msmf::state<StateBase_>{
template<class Event, class Fsm>
void on_entry(const Event&, Fsm&) const {
std::cout << "SubState21::on_entry()"<<"OuterSMData= "<<m_fsmHandler->m_outerSMData <<std::endl;
}
template<class Event, class Fsm>
void on_exit(const Event&, Fsm&) const {
std::cout << "SubState21::on_exit()" << std::endl;
}
};
typedef mpl::vector<SubState21> initial_state;
};
typedef msm::back::state_machine<State2_> State2;
// Set initial state
typedef State1 initial_state;

// Transition table
struct transition_table:mpl::vector<
msmf::Row < State1, Event1, State2, msmf::none, msmf::none >,
msmf::Row < State2, Event2, State1, msmf::none, msmf::none >
>{};

template<class Event, class Fsm>
void no_transition(Event const&, Fsm&, int state){
std::cout<<"no_transiton detected from state: "<< state << std::endl;
}

//void setPtr(int data/*MyFsm_ &fsm*/){State1::m_baseData=10;}
int m_outerSMData=44;
};
// Pick a back-end
typedef msm::back::state_machine<MyFsm_> MyFsm;

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector