C++ 如何实施";“基本状态”;可以访问boost::msm中状态机(SM)的后端/前端

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,感觉不对劲!有

我希望在州之间共享数据和访问,以及SM作为一个整体和客户端代码(即SM之外的代码)

根据我在网上的想法,最好的方法是从基类继承所有状态

添加一个基类并使所有状态&SM从中继承很简单,但是如何将处理程序作为这个基类的成员添加到SM的后端/前端,以及如何初始化它

这将编译,但在访问子状态中的fsmHandler集时崩溃(子状态通常不会访问根fsm)

问题:

如何访问根SM及其在SM层次结构的子机中的数据

Q1)如何解决运行时错误

问题2)我如何将数据从客户机代码(SM外部)传递到SM,感觉不对劲!有更好的方法吗?它是线程安全的吗

问题3)如何使
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; 
}