在以下函数中,IObserver的Process()函数完全有可能尝试使用this指针的DeleteObserver()从通知列表中将其自身删除。

这会导致迭代器陷入困境(不足为奇!),有办法解决吗?还是应该仔细研究我的设计?

void cButtonManager::DeleteObserver(IObserver *observer)
{
    list<IObserver*>::iterator iter;
    for (iter = m_ObserverList.begin(); iter != m_ObserverList.end(); ++iter)
    {
        if (*iter == observer)
        {
            // Found the specified observer in the list, delete it
            m_ObserverList.erase(iter);
            return;
        }
    }
}

void cButtonManager::NotifyObservers(void)
{
    list<IObserver*>::iterator iter;
    for (iter = m_ObserverList.begin(); iter != m_ObserverList.end(); ++iter)
    {
        (*iter)->Process(this);
    }
}

例如,假设列表是订阅杂志的人的集合,而Process()函数是发行新杂志的人;如果杂志的最新一期很糟糕,则订阅者可能希望直接取消订阅该杂志。

最佳答案

编辑:

评论中的某些人纠正了我,因此我将更改此答案。但是不要投票,因为这是评论者的解决方案,而不是我的。

(*iter++)->Process();

关于c++ - 您可以在遍历std::list时更改它吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7598443/

10-15 05:56