我有一个简单的事件处理系统,给我一些问题。要使用它,我从类EventHandler继承。然后,构造函数在构造时注册每个对象。

这是EventHandler的构造函数:

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


这将调用EventDispatcherregisterListener()成员函数,该成员函数将其存储在向量中。

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


mLisernerList在哪里看起来像:

vector<EventHandler*> mListenerList;


EventDispatcher只需在向量的每个元素上调用sendEvent()即可通知事件。

让我举一个例子来说明我的问题。可以说我的课程Buttons继承自EventHandler。我将在堆上创建按钮对象,然后将指向所有按钮的智能指针放在单个向量中。

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


发生的是,我最终在mButtons中得到一个unique_ptr的向量,并且在mListenerList中指向一个动态分配的相同Button对象的原始指针的向量。我不希望智能指针和原始指针指向同一对象。

理想情况下,我希望mButton中的shared_ptr s向量和mListenerList中的weak_ptr s向量指向动态分配的Button对象,同时允许EventHandler在创建时注册每个对象。这可能吗?

最佳答案

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。我将在堆上创建按钮对象,然后将指向所有按钮的智能指针放在单个向量中。

vector<std::shared_ptr<Buttons>> mButtons;
mButtons.push_back(make_event<Buttons>());

关于c++ - 我可以在此示例中使用shared_ptrs吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23500557/

10-13 03:00