我可以在这个例子中使用shared_ptrs吗?

时间:2014-05-06 16:54:06

标签: c++ shared-ptr smart-pointers weak-ptr

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

以下是EventHandler的构造函数:

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

这会调用EventDispatcher的{​​{1}}成员函数,该函数将其存储在向量中。

registerListener()

mLisernerList的位置如下:

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

vector<EventHandler*> mListenerList; 只是在向量的每个元素上调用EventDispatcher来通知它事件。

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

EventHandler

我最终得到mButtons中vector<unique_ptr<Buttons>> mButtons; mButtons.push_back(unique_ptr<Buttons>(new Button())); s的向量和mListenerList中指向相同动态分配的Button对象的原始指针向量。我不希望智能和原始指针指向同一个对象。

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

2 个答案:

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

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

答案 1 :(得分:1)

你无法天真地使用std::shared_ptr;有一些特别的 可能允许它的支持,但它过于复杂,并且 几乎肯定不适合这里;没有办法 EventDispatcher通常会“拥有”EventHandler

这里真正的问题是你想要使用智能的原因 指点在这里? EventHandler在其中注册 构造函数和析构函数中的注销。指针在 EventDispatcher纯粹用于导航。同一件事情 可能适用于mButtons,尽管有设计在哪里 情况可能并非如此。 (我倾向于对此持怀疑态度 unique_ptr的向量。这取决于矢量的位置 位于,但从我所看到的,额外的复杂性 需要访问实际指针超过了复杂性 手动处理删除。)