0

問題を引き起こしている単純なイベント処理システムがあります。それを使用するには、 class から継承しEventHandlerます。コンストラクターは、構築時に各オブジェクトを登録します。

EventHandlerのコンストラクタは次のとおりです。

EventHandler::EventHandler()
{
   EventDispatcher::getInstance().registerListener(this);
}

これは、これをベクトルに格納するEventDispatcherのメンバー関数を呼び出します。registerListener()

void EventDispatcher::registerListener(EventHandler* listener) 
{
   mListenerList.push_back(listener);
}

mLisernerList は次のようになります。

vector<EventHandler*> mListenerList;

は、ベクターの各要素に対して をEventDispatcher呼び出してsendEvent()、イベントを通知するだけです。

私の問題を示すために例を挙げましょう。私のクラスButtonsがから継承しているとしましょうEventHandler。ヒープ上にボタン オブジェクトを作成し、すべてのボタンへのスマート ポインターを 1 つのベクターに配置します。

vector<unique_ptr<Buttons>> mButtons;   
mButtons.push_back(unique_ptr<Buttons>(new Button()));

何が起こるかとunique_ptrいうと、mButtons の s のベクトルと、同じ動的に割り当てられた Button オブジェクトを指す mListenerList の生ポインタのベクトルになります。同じオブジェクトを指すスマート ポインターと生のポインターは必要ありません。

理想的には、作成時に EventHandler がすべてのオブジェクトを登録できるようにしながら、動的に割り当てられた Button オブジェクトを指す mButtonsshared_ptrの s のベクトルと mListenerList のs のベクトルが必要です。weak_ptrこれは可能ですか?

4

2 に答える 2

1
class EventHandler {
private
    EventHandler(); //make the constructors protected, also in derived when possible

    template<class T, class...Us> //and make this function a friend
    friend std::shared_ptr<EventHandler> make_event(Us...us);
};
//this is the function you use to construct Event objects
template<class T, class...Us>
std::shared_ptr<T> make_event(Us...us)
{
    auto s = std::make_shared<T>(std::forward<Us>(us)...);
    EventDispatcher::getInstance().registerListener(s);
    return s;
}

これは、これをベクターに格納する EventDispatcher の registerListener() メンバー関数を呼び出します。

void EventDispatcher::registerListener(std::weak_ptr<EventHandler> listener) 
{
   mListenerList.push_back(listener);
}

mLisernerList は次のようになります。

vector<std::weak_ptr<EventHandler>> mListenerList;

EventDispatcher は、ベクターの各要素で sendEvent() を呼び出すだけで、イベントを通知します。

私の問題を示すために例を挙げましょう。私のクラス Buttons が EventHandler を継承しているとしましょう。ヒープ上にボタン オブジェクトを作成し、すべてのボタンへのスマート ポインターを 1 つのベクターに配置します。

vector<std::shared_ptr<Buttons>> mButtons;   
mButtons.push_back(make_event<Buttons>());
于 2014-05-06T17:01:42.330 に答える