The*_*ist 2 c++ polymorphism inheritance pointers class
我有很多继承自抽象基SysLaserBase的类.我将每个激光添加到程序中的列表(指向对象的指针的矢量),如函数addLaser()中所示.这完全正常,它完全正常工作,我可以遍历我创建的所有激光并使用他们的方法没有问题.
当我想从系统中"移除"激光时,就会出现问题.我通过比较对象的地址和基类指针向量中的所有地址来做到这一点.这合法吗?它导致程序崩溃了一些时间.有什么选择?
请在此处找到方法的代码,然后是导致崩溃的调用示例.你在removeLaser()的代码中发现了什么问题吗?为什么在拆除单个激光后整个系统会变得疯狂?
涉及的向量是在基类的主体中:
std::vector<SysLaserBase<T>*> lasers;
Run Code Online (Sandbox Code Playgroud)
以及添加和删除方法:
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());
}
Run Code Online (Sandbox Code Playgroud)
调用此代码:
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
Run Code Online (Sandbox Code Playgroud)
谢谢你的任何努力:-)
感谢您的答复.根据您的回复,我已将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());
}
Run Code Online (Sandbox Code Playgroud)
现在好了.谢谢 :-)
it在之后无效lasers.erase().来自std::vector::erase():
对迭代元素及其与容器末尾之间的元素的迭代器和引用无效.
无论是break从for或保存从返回值erase().