我想定义一个派生自statechart::simple_state
的基类,它具有“预定义”的反应,这些反应本身称为虚函数(必须在派生类中实现)。我想要的是,如果某些状态来自我的基类,某些状态会自动对某些事件作出反应。
像这样(sc
是boost::statechart
):
struct EvHeartBeat : sc::event<EvHeartBeat> {};
template< class MostDerived,
class Context,
class InnerInitial = boost::mpl::list<>,
sc::history_mode historyMode = sc::has_no_history >
class BaseState : public sc::simple_state<
MostDerived, Context, InnerInitial, historyMode >
{
public:
typedef sc::custom_reaction<EvHeartBeat> reactions;
sc::result react (const EvHeartBeat& )
{
// maybe check some conditions here ...
return react_heartbeat();
}
protected:
virtual sc::result react_heartbeat() = 0;
};
然后,在派生类中:
struct MyState :
BaseState<MyState, MyChart>
{
// there are also other reactions
typedef sc::custom_reaction<OtherEvent> reactions;
sc::result react_heartbeat()
{
std::cout << "foo" << std::endl;
}
sc::result react (const OtherEvent&) { /* ... */ }
};
派生类中的typedef
将“覆盖”我假设的基类中的那个,所以我可能需要将心跳事件的custon_reaction
定义为派生类中的列表同样。但也许这个设计不像这个图书馆的设计师认为它应该是什么,谁能帮我解决这个问题呢?
修改
与此同时,我获得了一些额外的知识。 typedef
的解决方法是在派生类而不是基类中定义它。但是,出现了一个奇怪的问题:编译器找不到react (const EvHeartBeat& )
的方法,尽管它是在基类中定义的,如果我删除其他反应(react (const OtherEvent& )
)它作品。但当然这不是我想要的,我希望能够对多个事件做出反应。
答案 0 :(得分:0)
我也在boost-users
毫升问了这个问题并得到了一个很有帮助的答案。问题是,尽管参数列表不同(OtherEvent
与EvHeartBeat
),但子类中的方法定义会对父类中的定义进行阴影处理。解决方案是明确地重用超类中的方法:
using BaseState::react;
result react ( const OtherEvent& );
这个就像它应该的那样。