gpt4 book ai didi

c++ - std::remove 不是从 std::vector 中移除

转载 作者:太空狗 更新时间:2023-10-29 21:29:01 29 4
gpt4 key购买 nike

这是我的问题:在我的 GUI 中,有几种类型的监听器。它们存储在 std::vector<WhateverListener*>

在我的 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 析构函数中,我遍历了 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 转换为该类型。但我认为它只会比较指针,如果它们是 ==,它会删除它吗?

最佳答案

恐怕您可能会被 C++ 中的对象标识和虚拟基类所困扰

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html

基本上,将指针转换为多态基数不能保证得到相同的指针值(例如,当转换为 (void*) 时)。

应该只要您存储与您在删除期间将它投向的完全相同的指针类型,但我不能如果不查看更多代码/小部件类层次结构,就不能确定。

关于c++ - std::remove 不是从 std::vector 中移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5773882/

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