0

如果我向事件添加属性,我知道我可以像使用函数一样使用事件名称......

BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(*someEvent*, *someAttributeList*)

someStateMachine.process_event(
   someEvent (
      valueOfSomeAttribute1, // sets the attribute value here
      valueOfSomeAttribute2))

并且在一个动作中我可以通过写

evt.get_attribute(someAttribute1);  // retrieve the attribute value

现在,如果我为整台机器设置一个属性,如下所示:

BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table,
                         init_ << initState,
                         Entry_Action, 
                         Exit_Action, 
                         attributes_ << someAttribute1 << someAttribute2,
                         configure_<< someConfigurationStuff ),
                         newStateMachineType)

如何为 someAttribute1 设置值?

对州同样的问题:

BOOST_MSM_EUML_STATE(
       (someEntryAction,
        someExitAction,
        attributes_ << someAttribute1,
        configure_<< someConfigurationStuff)
       ,newStateName)

如何为 someAttribute1 设置值?

最后,

有没有办法在创建对象后更改属性?

例如,我想为状态机设置一个属性,并且在我的一个状态中,记住一些我可以存储在状态机中的信息。(在这种情况下,我想存储一个套接字。)

谢谢。

4

1 回答 1

1

如何为 someAttribute1 设置值? 你可以:

  • 更改您刚刚获得的参考(get_attribute 返回参考):++evt.get_attribute(someAttribute1)。
  • 使用函子直接在表中写入属性。例如,可以执行以下操作:/++fsm_(someAttribute1)

对于各州,您也可以这样做。对于状态机,同样如此。同样,您可以在操作中使用 Fsm 模板参数,也可以使用仿函数(fsm_、event_ 等)

您可以在示例或测试中找到很好的示例(例如 test/CompositeEuml.cpp 或 test/AnonymousEuml.cpp)。

HTH,克里斯托夫

于 2012-08-31T15:13:43.170 回答