在以下函数中,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/