1

から派生した基本クラスを定義したいと思います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& )

4

1 に答える 1

0

boost-usersmlでもこれを尋ねたところ、非常に役立つ回答が得られました。問題は、サブクラスのメソッド定義が親クラスの定義をシャドウすることですが、パラメーター リストは異なります ( OtherEventvs. EvHeartBeat)。解決策は、スーパー クラスのメソッドを明示的に再利用することです。

using BaseState::react;

result react ( const OtherEvent& );

これは本来のように機能します。

于 2012-02-19T14:31:59.153 に答える