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

标签 c++ class inheritance pointers polymorphism

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

当我想从系统中“删除”激光器时,问题就发生了。我通过将对象的地址与基类指针 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());
}

现在好了。 谢谢:-)

最佳答案

itlasers.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/

相关文章:

c# - 这个还是基地?在什么情况下我们可以使用 base 而不是 this?

c++ - 如何更改for循环之前声明的变量值并尝试在C++中更改for循环中的值?

javascript - 如何使用默认参数为 Tic-Tac-Toe 游戏中的第一个玩家随机化 "X"和 "O"符号?

c++ - CMake 在创建简单项目时无法在 Windows 中找到 SFML 目录

python - 如何制定一个类方法?

c++ - 未定义类型的类型转换

c++ - 模板基类的子类的模板特化

Javascript 闭包和继承

c++ - 内存映射文件 - 映射结构而不是文件?

c++ - 回文之谜: Why an array of size 3 ends up being printed with 5 elements?