使用boost :: msm eUML,如果我赋予attributes_<<到状态机或状态,我如何(重新)设置它们?

时间:2012-08-29 00:56:49

标签: boost-msm

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

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的值?

最后,

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

HTH, 克里斯托夫