我是MSM的新手,我认为这是一个很好的工具,尤其是eUML前端方法。但是,经过几天的阅读,我仍然不太确定如何在MSM eUML定义的状态机与外部世界之间交换数据。我认为两种可能的方式是:使用“ attributes_ 使用全局变量,其中fsm操作函数存储数据,而外部代码读取数据我还没有找到其他更好的方法。关于方法1,我不确定如何从外部访问Attr1。我想“ fsm_(Attr1)”仅由fsm内部函数或方法用来访问属性。那么,有没有一种方法可以让外人读取“ fsm.Attr1”呢?对于方法2,显然全局变量是我们始终要避免的事情。欢迎任何建议! (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您可以使用以下步骤进行操作:首先定义属性。BOOST_MSM_EUML_DECLARE_ATTRIBUTE(type,name)例如,BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::stringstream,my_attr_logger)访问属性。fsm.get_attribute(name)例如, template <class Event,class FSM> void on_entry(Event const& /*evt*/,FSM& fsm) { std::cout << "entering: Empty" << std::endl; fsm.get_attribute(my_attr_logger) << "entering: Empty\n"; }get_attribute()和name的组合是关键。**使用属性创建状态机。见https://www.boost.org/doc/libs/1_66_0/libs/msm/doc/HTML/ch03s04.html#eUML-build-sm例如,// create a state machine "on the fly"BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT init_ << Empty, // Init State no_action, // Entry no_action, // Exit attributes_ << my_attr_logger, // ==== Attributes configure_ << no_configure_, // configuration Log_No_Transition // no_transition handler ), player_) //fsm name**最后,通过外界的状态机后端访问属性。statemachine_backend.get_attribute(name)例如, std::cout <<p.get_attribute(my_attr_logger).str() << std::endl;您可以使用状态机的前端和后端的get_attribute()。演示版这是运行演示:https://wandbox.org/permlink/nKqb2pEX5AZKeboUmy_attr_logger是属性的名称。我刚刚添加了std::stringstream作为属性。基本代码是官方示例代码。见https://www.boost.org/doc/libs/1_66_0/libs/msm/doc/HTML/examples/SimplePhoenix.cpp (adsbygoogle = window.adsbygoogle || []).push({});
10-08 11:16