我想将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());
}
有关如何将boost:msm拆分为多个文件的任何帮助和提示都表示赞赏。
答案 0 :(得分:3)
您可以使用公共继承将State1和State2引入MyFsm,如下所示:
struct MyFsm_ : msmf::state_machine_def<MyFsm_>
{
struct State1_ : State1 {}; // use public inheritance
struct State2_ : State2 {}; // use public inheritance
// Set initial state
typedef State1_ initial_state;
// Transition table
struct transition_table:mpl::vector<
msmf::Row < State1_, Event1, State2_, msmf::none, msmf::none >
>{};
};
在MyFsm_
中,使用State1_和State2_而不是State1和State2。
我更新了您的代码,然后就可以了。
这是运行演示: https://wandbox.org/permlink/ZrIVQY38C51fZNFY
您可以看到完整的源代码。该选项卡对应于头文件。最左边的名称具有固定名称prog.cc
。通常用于放置int main()
。