- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我的问题:在我的 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/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!