C++ 如何实施";“基本状态”;可以访问boost::msm中状态机(SM)的后端/前端
我希望在州之间共享数据和访问,以及SM作为一个整体和客户端代码(即SM之外的代码) 根据我在网上的想法,最好的方法是从基类继承所有状态 添加一个基类并使所有状态&SM从中继承很简单,但是如何将处理程序作为这个基类的成员添加到SM的后端/前端,以及如何初始化它 这将编译,但在访问子状态中的fsmHandler集时崩溃(子状态通常不会访问根fsm) 问题: 如何访问根SM及其在SM层次结构的子机中的数据 Q1)如何解决运行时错误 问题2)我如何将数据从客户机代码(SM外部)传递到SM,感觉不对劲!有更好的方法吗?它是线程安全的吗 问题3)如何使C++ 如何实施";“基本状态”;可以访问boost::msm中状态机(SM)的后端/前端,c++,boost,template-meta-programming,boost-msm,C++,Boost,Template Meta Programming,Boost Msm,我希望在州之间共享数据和访问,以及SM作为一个整体和客户端代码(即SM之外的代码) 根据我在网上的想法,最好的方法是从基类继承所有状态 添加一个基类并使所有状态&SM从中继承很简单,但是如何将处理程序作为这个基类的成员添加到SM的后端/前端,以及如何初始化它 这将编译,但在访问子状态中的fsmHandler集时崩溃(子状态通常不会访问根fsm) 问题: 如何访问根SM及其在SM层次结构的子机中的数据 Q1)如何解决运行时错误 问题2)我如何将数据从客户机代码(SM外部)传递到SM,感觉不对劲!有
typedef StateBase\ustatebase
编译
如果您能提供一份工作样品,我将不胜感激。
提前感谢您的时间和帮助
守则:
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());
}
intmain()
{
std::cout您可以从子状态访问外部状态机。
这是基于代码的状态机图
+-------+--------------------------------------------------------+
| Fsm_ | member variable: m_outerSMData |
+-------+ |
| |
| * |
| | |
| V |
| +----------+ +-----------------------------------+ |
| | State1 | | State2 | |
| +----------+Event1+-----------------------------------+ |
| | |----->| on_entry/rootFsm=&f | |
| | | | member variable: rootFsm | |
| | | | +---------------------------+ | |
| | |Event2| | SubState21 | | |
| | |<-----| | | | |
| | | | | on_entry/ | | |
| | | | | access | | |
| | | | | f.rootFsm->m_outerSMData | | |
| | | | +---------------------------+ | |
| +----------+ +-----------------------------------+ |
+----------------------------------------------------------------+
以下是现场演示:
我没有第一季度和第三季度的答案,但我知道实现第二季度的一种方法。这里有一种方法。process\u event()不是线程安全的。您需要锁定它。@Takatoshi Kondo,因此您建议手动将对fsm的引用沿着层次结构一个接一个地传递到每个子机中。谢谢,解决方案很简单而且有效;它是离题注释。我现在正在休假。我无法在两周内回答。因为fsm_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和State2_uuuuuuuuuuuuuuuuuuuuuuuuu像这样解决它,或者您可以简单地共享您的用户定义数据目录,而不是共享父状态机。请参阅
+-------+--------------------------------------------------------+
| Fsm_ | member variable: m_outerSMData |
+-------+ |
| |
| * |
| | |
| V |
| +----------+ +-----------------------------------+ |
| | State1 | | State2 | |
| +----------+Event1+-----------------------------------+ |
| | |----->| on_entry/rootFsm=&f | |
| | | | member variable: rootFsm | |
| | | | +---------------------------+ | |
| | |Event2| | SubState21 | | |
| | |<-----| | | | |
| | | | | on_entry/ | | |
| | | | | access | | |
| | | | | f.rootFsm->m_outerSMData | | |
| | | | +---------------------------+ | |
| +----------+ +-----------------------------------+ |
+----------------------------------------------------------------+
struct MyFsm_; // forward declaration
struct State2__ .... { // class definition
// member function template declaration
template<class Event, class Fsm> void on_entry(const Event&, Fsm& f);
MyFsm_* rootFsm;
};
struct MyFsm_ ... { // class definition
// requre State2__ definition here
};
// member function template definition
template<class Event, class Fsm> void State2__::on_entry(const Event&, Fsm& f) {
// requre MyFsm_ definition here
rootFsm = &f;
std::cout << "Print OuterSMData= " << rootFsm->m_outerSMData << std::endl;
}