2012-02-16 19 views
1

statechart::simple_stateから派生した基底クラスを定義したいと思います。これは、それ自体が仮想関数(派生クラスで実装する必要がある)を呼び出す "事前定義"反応を持っています。私が望むのは、いくつかの州は、私の基底クラスから派生するものであれば、特定のイベントに自動的に反応するということです。このよう継承反応

scboost::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は、ベースクラスI内の1つを "上書き" されますおそらく、派生クラスのリストとしてハートビートイベントにcuston_reactionを定義する必要があるかもしれません。しかし、おそらくこのデザインは、この図書館のデザイナーがそうしなければならないと思ったようなものではありません。一方

EDITは、私はいくつかの追加の知識を得ました。 typedefの回避策は、基本クラスではなく、派生クラスで定義することです。しかし、奇妙な問題が発生します。他の反応(react (const OtherEvent&))を削除すると、コンパイラはreact (const EvHeartBeat&)のメソッドを見つけません。もちろん、それは私が望むものではなく、私は複数の出来事に反応できるようにしたい。

答えて

0

これもboost-users mlで尋ねられ、多くの助けをした回答がありました。問題は、サブクラスのメソッド定義が、パラメータリストが(OtherEventEvHeartBeat)異なるが、親クラスの定義を削除することである。解決策は明示的にスーパークラスからメソッドを再使用することです。それが必要のよう

using BaseState::react; 

result react (const OtherEvent&); 

この1作品。