這是我的問題: 在我的GUI中,有幾種類型的偵聽器。它們存儲在std::vector<WhateverListener*>
std :: remove不會從std :: vector中刪除
在我的GUI,我呼籲的方法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());
}
所以,在Widget的析構函數,我通過窗口小部件的孩子迭代,並調用removeListeners()
:
Widget::~Widget(void)
{
for(std::vector<Widget*>::iterator it = getChildBegin();
it != getChildEnd(); ++it)
{
(*it)->removeListeners(this);
(*it)->parentWidget = NULL;
(*it)->_container = NULL;
}
}
它不工作。在一個正在傾聽孩子的Widget上調用delete之後,孩子們仍然有聽衆。
但是,如果我直接調用remove
方法,以及小部件從聽者繼承,它的工作原理:
Widget::~Widget(void)
{
for(std::vector<Widget*>::iterator it = getChildBegin();
it != getChildEnd(); ++it)
{
(*it)->removeWidgetListener(this);
(*it)->parentWidget = NULL;
(*it)->_container = NULL;
}
}
那麼,爲什麼一個工作,而不是其他?我發現的唯一區別在於,我在第一個中將一個Widget轉換爲該類型。但我認爲它只是比較指針,如果他們==它會刪除它?
鑄造告訴編譯器「*我知道這個變量的類型,即使你不知道。」你不應該把一個指針指向一個不是真的類型。每個'Widget *'同時傳遞給'removeListeners()'一個焦點,鼠標,鍵盤和小部件監聽器嗎? – 2011-04-24 23:23:16
更好地修改標題以提及'erase',因爲我和其他人可能首先認爲這只是另一個不理解「刪除」如何工作的問題。 ;) – Xeo 2011-04-24 23:25:50
@Xeo:是的,我在閱讀帖子之前輸入了_that_答案,然後在5秒內刪除它:) – sehe 2011-04-24 23:44:00