从对象指针的 STD 列表中擦除对象

erase object from std list of object pointers

本文关键字:对象 擦除 列表 指针 STD      更新时间:2023-10-16

我有一个处理玩家列表的类大厅(这是一个抽象类,只有纯虚拟方法)现在我尝试执行以下操作:

    ...    
    std::list<Player*> list;
    ...
    Lobby::Lobby (std::string name, unsigned int size){
        m_size = size;
        m_name = name;
        std::list<Player*> list(size);
    }
    ...
    void Lobby::removePlayer(int playerID){
    for (std::list<Player*>::iterator it = list.begin(); it != list.end(); it++){
    if ((*it)->id == playerID){
        it = list.erase(it);
    }
}
}
    ...

我总是得到两个错误,并且不知道如何解决它们:

error C2259: 'Member' : cannot instantiate abstract
    class

我几乎是新手C++,但认为如果我使用基类的指针列表,它应该可以工作?!

  IntelliSense: no suitable user-defined conversion from "std::_List_iterator<std::_List_val<std::_List_simple_types<Member>>>" to "std::_List_iterator<std::_List_val<std::_List_simple_types<Member *>>>" exists**

几点:首先,关于你的问题。我看不出您提供的代码没有任何问题,除了它不是您正在编译的代码。看起来,您有一个成员列表*,并将其称为成员。其次,看remove_if。它不适合为你做工作。最后,看起来您这里有内存泄漏。您从列表中删除了播放器的实例,但不释放其内存(调用 delete)

我可以从错误消息中看出您没有向我们显示实际代码。第二条消息告诉我们你有一个list<Member*>,也许是一个list<Member>,或者至少是两者的迭代器。list<Member>也可以解释第一个错误,因为list操作试图构造Member对象,这是不可能的。

我的猜测是,你把*忘在了某个地方。

您还需要查看对象的生命周期。C++没有垃圾回收器,因此仅从该列表中擦除指针不会杀死Member对象本身。最好使用克里斯在他的评论中建议的智能指针。