Voici mon problème: Dans mon interface graphique, il existe plusieurs types d'écouteurs. Ils sont stockés dans std::vector<WhateverListener*>
std :: remove ne supprime pas de std :: vector
Dans mon interface graphique, j'ai une méthode appelée removeListeners
et il ressemble à ceci:
void Widget::removeListeners(Widget* widget)
{
removeFocusListener((FocusListener*)widget);
removeMouseListener((MouseListener*)widget);
removeKeyboardListener((KeyboardListener*)widget);
removeWidgetListener((WidgetListener*)widget);
}
Fondamentalement, je ne pense pas que ce devrait importe comment je l'ai jeté; ce ne sont que des pointeurs. Je pense que std::remove
compare simplement les pointeurs, donc si je fournis un widget *, cela ne devrait rien affecter (je pense).
Comment les fonctions remove look est quelque chose comme ceci:
void Widget::removeWidgetListener(
WidgetListener *listener)
{
widgetListeners.erase(
std::remove(widgetListeners.begin(),
widgetListeners.end(), listener),
widgetListeners.end());
}
Ainsi, dans le destructor Widget, j'itérer les enfants du widget et appelle removeListeners()
:
Widget::~Widget(void)
{
for(std::vector<Widget*>::iterator it = getChildBegin();
it != getChildEnd(); ++it)
{
(*it)->removeListeners(this);
(*it)->parentWidget = NULL;
(*it)->_container = NULL;
}
}
Il ne fonctionne pas. Après avoir appelé supprimer sur un Widget qui écoutait ses enfants, les enfants avaient encore des auditeurs.
Cependant, si j'appelle les méthodes directement remove
et le widget hérite de l'auditeur, il fonctionne:
Widget::~Widget(void)
{
for(std::vector<Widget*>::iterator it = getChildBegin();
it != getChildEnd(); ++it)
{
(*it)->removeWidgetListener(this);
(*it)->parentWidget = NULL;
(*it)->_container = NULL;
}
}
Alors, pourquoi ne un travail et pas l'autre? La seule différence que je remarque est que dans le premier je lance un Widget à ce type. Mais je pensais que ce serait juste comparer les pointeurs et si elles étaient == il l'enlèverait?
La conversion indique au compilateur "* I * connaître le type de cette variable, même si ce n'est pas le cas." Vous ne devriez pas lancer un pointeur sur un type qui n'est pas vraiment.Est-ce que chaque 'Widget *' est passé à 'removeListeners()' simultanément un focus, une souris, un clavier et un écouteur de widget? –
Mieux vaut modifier le titre pour mentionner «effacer», car moi et peut-être d'autres personnes ont d'abord pensé que c'était juste une autre question qui ne comprenait pas comment «supprimer» fonctionne. ;) – Xeo
@Xeo: Yup, j'avais tapé _that_ réponse avant de lire le post, puis l'ai supprimé en 5 secondes :) – sehe