Я хочу разбить реализацию boost :: msm statemachine на несколько файлов.Я ищу что-то вроде:
1) Один заголовок на состояние
2) Один заголовок для основного конечного автомата (внешний SM) Но я не знаю, как этофайл должен быть записан
3) клиентский код, который использует SM.
Ниже приводится то, что я придумал (который не компилируется, выдавая ошибки в виде: «недопустимое использование»неполного типа "и другие ошибки).
Первое состояние выборки:
//State1.h
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
struct State1:msmf::state<>
{
// Entry action
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
std::cout << "State1::on_entry()" << std::endl;
}
// Exit action
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
std::cout << "State1::on_exit()" << std::endl;
}
};
Второе состояние выборки:
//State2.h
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
struct State2:msmf::state<>
{
// Entry action
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
std::cout << "State2::on_entry()" << std::endl;
}
// Exit action
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
std::cout << "State2::on_exit()" << std::endl;
}
};
Основной SM:
//MyFsm.h
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
#include "state1.h"
#include "state2.h"
namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
// ----- Events
struct Event1 {};
struct Event2 {};
struct MyFsm_ : msmf::state_machine_def<MyFsm_>
{
struct State1;//??? is this the correct way
struct State2;//???
// Set initial state
typedef State1 initial_state;
// Transition table
struct transition_table:mpl::vector<
...
>{};
};
// Pick a back-end
typedef msm::back::state_machine<MyFsm_> MyFsm;
Код клиента:
//main.h
#include "myfsm.h"
int main()
{
MyFsm fsm;
fsm.start();
fsm.process_event(Event1());
}
Любая помощь и подсказка о том, как разделить повышение: msm на несколько файлов, приветствуется.