У меня есть простая система обработки событий, которая вызывает у меня проблемы. Чтобы использовать его, я наследую от класса EventHandler
. Затем конструктор регистрирует каждый объект при построении.
Вот конструктор EventHandler
:
EventHandler::EventHandler()
{
EventDispatcher::getInstance().registerListener(this);
}
Это вызывает функцию-член registerListener()
EventDispatcher
, которая сохраняет это в векторе.
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()));
Что происходит, так это то, что я получаю вектор unique_ptr
s в mButtons и вектор необработанных указателей в mListenerList, указывающих на одни и те же динамически выделяемые объекты Button. Я не хочу, чтобы умные и необработанные указатели указывали на один и тот же объект.
В идеале я хотел бы, чтобы вектор shared_ptr
s в mButtons и вектор weak_ptr
s в mListenerList указывал на динамически выделяемые объекты Button, позволяя EventHandler регистрировать каждый объект при создании. Это возможно?
std::enable_shared_from_this
- person OmnipotentEntity   schedule 06.05.2014weak_ptr
), но необработанные указатели по-прежнему лучше всего подходят для указателей, не владеющих, когда вы знаете, что объект переживет указатель. Интеллектуальные указатели не являются серебряной пулей, вам все равно нужно четкое представление о владении, иначе вы получите проблемы, возможно, не оборванные указатели или двойные удаления, а, например, низкую производительность или утечки памяти. - person Chris Drew   schedule 07.05.2014