Унаследовать реакции - PullRequest
       19

Унаследовать реакции

1 голос
/ 16 февраля 2012

Я бы хотел определить базовый класс, производный от statechart::simple_state, который имеет «предопределенные» реакции, которые сами вызывают виртуальные функции (которые должны быть реализованы в производных классах).Я хотел бы, чтобы некоторые состояния автоматически реагировали на определенные события, если они происходят из моего базового класса.

Вот так (sc is 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& )), она работает.Но, конечно, это не то, чего я хочу, я хочу иметь возможность реагировать на несколько событий.

1 Ответ

0 голосов
/ 19 февраля 2012

Я также спросил об этом на boost-users мл и получил ответ, который мне очень помог. Проблема в том, что определение метода в подклассе затеняет определение в родительском классе, хотя список параметров отличается (OtherEvent против EvHeartBeat). Решение состоит в том, чтобы явно повторно использовать метод из суперкласса:

using BaseState::react;

result react ( const OtherEvent& );

Этот работает так, как должен.

...