从std对象指针列表中擦除对象

时间:2014-01-06 12:11:02

标签: c++ visual-studio-2013 erase stdlist

我有一个类Lobby,它处理一个Players列表(这是一个抽象类,只有纯虚方法),现在我尝试执行以下操作:

    ...    
    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**

2 个答案:

答案 0 :(得分:0)

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

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

您还需要查看对象的生命周期。 C ++没有垃圾收集器,所以只删除该列表中的指针不会杀死Member个对象本身。更好地使用像克里斯在他的评论中建议的智能指针。

答案 1 :(得分:0)

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