gpt4 book ai didi

c++ - 我可以在此示例中使用 shared_ptr 吗?

转载 作者:行者123 更新时间:2023-11-28 02:48:53 25 4
gpt4 key购买 nike

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

这是 EventHandler 的构造函数:

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

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

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

mLisernerList 在哪里看起来像:

vector<EventHandler*> mListenerList;

EventDispatcher 只是调用 vector 的每个元素上的 sendEvent() 来通知它事件。

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

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

最终我得到了 mButtons 中的 unique_ptr vector 和 mListenerList 中指向相同动态分配的 Button 对象的原始指针 vector 。我不希望智能指针和原始指针指向同一个对象。

理想情况下,我希望 mButtons 中的 shared_ptr vector 和 mListenerList 中的 weak_ptr vector 指向动态分配的 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() 成员函数,该函数将其存储在 vector 中。

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

mLisernerList 在哪里看起来像:

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

EventDispatcher 只需调用 vector 的每个元素上的 sendEvent() 来通知它事件。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com