C ++ - 高级多态:这个函数从列表中删除指针是否合法?

时间:2012-04-18 13:12:53

标签: c++ class inheritance pointers polymorphism

我有许多从抽象基SysLaserBase继承的类。我将每个激光添加到程序中的列表(指向对象的指针的矢量),如函数addLaser()中所示。这非常好用,它完全正常工作,我可以遍历我创建的所有激光并使用他们的方法没有问题。

当我想从系统中“移除”激光时,就会出现问题。我通过比较对象的地址和基类指针向量中的所有地址来做到这一点。这合法吗?它导致程序崩溃了一些时间。有什么替代方案?

请在此处查找方法的代码,然后查看导致崩溃的调用示例。你在removeLaser()的代码中发现了什么问题吗?为什么整个系统在移除单个激光后会变得疯狂?

涉及的向量是在基类的主体中:

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());
}

现在好了。 谢谢: - )

1 个答案:

答案 0 :(得分:5)

{p> itlasers.erase()之后失效。来自std::vector::erase()

  

对擦除元素以及它们与容器末尾之间的元素的迭代器和引用无效。

来自break的{​​{1}}或保存for的返回值。