Вот моя проблема: в моем графическом интерфейсе есть несколько типов слушателей. Они хранятся в std::vector<WhateverListener*>
В моем графическом интерфейсе у меня есть метод removeListeners
, и он выглядит так:
void Widget::removeListeners( Widget* widget )
{
removeFocusListener((FocusListener*)widget);
removeMouseListener((MouseListener*)widget);
removeKeyboardListener((KeyboardListener*)widget);
removeWidgetListener((WidgetListener*)widget);
}
По сути, я не думаю, что это должно иметь значение, как я его использую; они просто указатели. Я думаю, что std::remove
просто сравнивает указатели, поэтому, если я предоставлю виджет*, он ни на что не повлияет (я думаю).
Функции удаления выглядят примерно так:
void Widget::removeWidgetListener(
WidgetListener *listener )
{
widgetListeners.erase(
std::remove(widgetListeners.begin(),
widgetListeners.end(), listener),
widgetListeners.end());
}
Итак, в деструкторе виджета я перебираю дочерние элементы виджета и вызываю removeListeners()
:
Widget::~Widget(void)
{
for(std::vector<Widget*>::iterator it = getChildBegin();
it != getChildEnd(); ++it)
{
(*it)->removeListeners(this);
(*it)->parentWidget = NULL;
(*it)->_container = NULL;
}
}
Это не работает. После вызова удаления для виджета, который прослушивал своих дочерних элементов, у дочерних элементов все еще были слушатели.
Однако, если я вызываю методы remove
напрямую, а виджет наследуется от слушателя, он работает:
Widget::~Widget(void)
{
for(std::vector<Widget*>::iterator it = getChildBegin();
it != getChildEnd(); ++it)
{
(*it)->removeWidgetListener(this);
(*it)->parentWidget = NULL;
(*it)->_container = NULL;
}
}
Так почему же одно работает, а другое нет? Единственная разница, которую я замечаю, заключается в том, что в первом я привожу виджет к этому типу. Но я думал, что он просто сравнит указатели, и если они будут ==, он удалит их?
Widget*
переданнымremoveListeners()
одновременно фокусом, мышью, клавиатурой и прослушивателем виджета? - person Asher Dunn   schedule 25.04.2011erase
, так как я и, возможно, другие сначала подумали, что это просто еще один вопрос, который не понимает, как работаетremove
. ;) - person Xeo   schedule 25.04.2011