[英]Can you change a std::list while iterating through it?
在以下函數中,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();
我不明白你為什么不在這里使用list::remove
。 這似乎是一個完美的匹配我。
對於NotifyObserver
的問題,我不會讓Process
執行刪除本身,而是讓它發出信號表明它希望自己從觀察者列表中刪除。 顯而易見:將一個bool從Process
返回到signal,然后調用list::erase
就可以了。 將erase
的返回值分配給當前iter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.