gpt4 book ai didi

C++ - 高级多态性 : Is this function legal for removing pointers from a list?

转载 作者:搜寻专家 更新时间:2023-10-31 00:43:43 26 4
gpt4 key购买 nike

我有很多继承自抽象基类 SysLaserBase 的类。正如您在函数 addLaser() 中看到的那样,我将每个激光添加到程序中的列表(指向对象的指针的 vector )。这工作得很好,而且完全正常,我可以循环使用我创建的所有激光器并毫无问题地使用他们的方法。

当我想从系统中“移除”激光时,问题就发生了。为此,我将对象的地址与基类指针的 vector 中的所有地址进行比较。这是合法的吗?它导致程序有时崩溃。还有什么选择?

请在此处找到方法的代码,然后是导致崩溃的调用示例。你发现 removeLaser() 的代码有什么问题吗?为什么去掉一个激光器后整个系统就疯了?

涉及的 vector 在基类的主体中:

std::vector<SysLaserBase<T>*> lasers;

以及添加和删除方法:

template <typename T>
void SysSystemBase<T>::addLaser(const SysLaserBase<T> &src)
{
bool alreadyThere = 0;
for(unsigned long i = 0; i < lasers.size(); i++)
{
if(&src == lasers[i])
{
alreadyThere = 1;
break;
}
}
if(!alreadyThere)
{
lasers.push_back(const_cast<SysLaserBase<T>*>(&src));
}
signalsOut.resize(lasers.size());
}


template <typename T>
void SysSystemBase<T>::removeLaser(const SysLaserBase<T> &src)
{
for(typename std::vector<SysLaserBase<T>*>::iterator it = lasers.begin(); it != lasers.end(); ++it)
{
if((*it) == &src)
{
lasers.erase(it);
}
}
signalsOut.resize(lasers.size());
}

这段代码的调用:

sys.addLaser(las0);
sys.addLaser(las1);
sys.addLaser(las2);
sys.removeLaser(las0); //removes the laser, but cycling through the lasers through the vector of base class causes a crash
sys.removeLaser(las1);
sys.removeLaser(las2); //crashes the program immediately after this call

感谢您的努力:-)


感谢您的回复。根据您的回复,我已将 removeLaser() 更改为:

template <typename T>
void SysSystemBase<T>::removeLaser(const SysLaserBase<T> &src)
{
for(typename std::vector<SysLaserBase<T>*>::iterator it = lasers.begin(); it != lasers.end(); ++it)
{
if((*it) == &src)
{
lasers.erase(it);
break;
}
}
signalsOut.resize(lasers.size());
}

现在好了。谢谢:-)

最佳答案

lasers.erase()之后失效。来自 std::vector::erase() :

Iterators and references to the erased elements and to the elements between them and the end of the container are invalidated.

forbreak 或保存 erase() 的返回值。

关于C++ - 高级多态性 : Is this function legal for removing pointers from a list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10210122/

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