focus on linux, c/c++, lua

一个隐蔽的错误

转[http://blog.csdn.net/yanonsoftware/archive/2005/11/26/537314.aspx]

有一个界面系统,一个window类,用来封装自身的操作、绘图功能,并管理它的所有子窗口:
class Window
{
Window* m_pParent;
list<Window*> m_children;
public:
void RemoveChild(Window *pChild)
{
   m_children.remove(pChild);
}
virtual void Update()
{
   for(list<Window*>::iter=m_children.begin();
    iter=m_children.end();++iter)
   {
    (*iter)->Update();
   }//endof for
}
};

这个Window::Update()函数负责处理窗口逻辑,结果在某个窗口的Update写成了这样:
class MyDlg : public Window
{
public:
virtual void Update()
{
   if(m_bClosed)
    m_pParent->RemoveChild(this);
   else
    Window::Update();
}
};
当一个模块的逻辑比上述例子复杂很多时,这种情况更难以掌握,为了防止模块客户的代码产生类似的行为,我不得不把代码写成这样:
class Window
{
Window* m_pParent;
list<Window*> m_children;
bool m_bLock;
public:
void RemoveChild(Window *pChild)
{
   ASSERT(!m_bLock);
   m_children.remove(pChild);
}
virtual void Update()
{
   m_bLock=true;
   for(list<Window*>::iter=m_children.begin();
    iter=m_children.end();++iter)
   {
    (*iter)->Update();
   }//endof for
   m_bLock=false;
}
};

这个问题就出在了顺序迭代器的删除问题上iterator,顺序迭代器删除的正确写法是:

iter = xxx.erase(iter);


posted on 2010-10-20 10:01 zuhd 阅读(215) 评论(0)  编辑 收藏 引用 所属分类: c/c++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理