• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            focus on linux, c/c++, lua

            一個隱蔽的錯誤

            轉(zhuǎn)[http://blog.csdn.net/yanonsoftware/archive/2005/11/26/537314.aspx]

            有一個界面系統(tǒng),一個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()函數(shù)負(fù)責(zé)處理窗口邏輯,結(jié)果在某個窗口的Update寫成了這樣:
            class MyDlg : public Window
            {
            public:
            virtual void Update()
            {
               if(m_bClosed)
                m_pParent->RemoveChild(this);
               else
                Window::Update();
            }
            };
            當(dāng)一個模塊的邏輯比上述例子復(fù)雜很多時,這種情況更難以掌握,為了防止模塊客戶的代碼產(chǎn)生類似的行為,我不得不把代碼寫成這樣:
            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 閱讀(245) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

            狠狠精品久久久无码中文字幕| 久久综合亚洲鲁鲁五月天| 欧洲精品久久久av无码电影| 久久久久久国产精品免费无码| 久久久无码人妻精品无码| 国产成人精品久久一区二区三区av| 久久综合伊人77777| 久久久久女人精品毛片| 亚洲欧美精品伊人久久| 国产亚洲精品久久久久秋霞| 久久国产成人精品麻豆| 久久久久久久免费视频| 国内精品伊人久久久久| 久久一区二区三区99| 久久se精品一区二区| 日本WV一本一道久久香蕉| 色综合合久久天天综合绕视看| 国产精品亚洲综合久久| 国产精品免费看久久久香蕉 | 看全色黄大色大片免费久久久| 内射无码专区久久亚洲| 久久久久中文字幕| 日产精品久久久久久久| 亚洲精品无码久久久久AV麻豆| 26uuu久久五月天| av无码久久久久久不卡网站| 欧美成人免费观看久久| 久久精品二区| 久久www免费人成看国产片| 久久综合中文字幕| 国产精品久久久久影院色| 无码人妻久久一区二区三区免费| 香蕉aa三级久久毛片| 国产精品欧美久久久久无广告| 久久精品国内一区二区三区| 精品无码久久久久久尤物| 欧美牲交A欧牲交aⅴ久久| 色欲综合久久中文字幕网| 日本欧美久久久久免费播放网| 亚洲国产欧洲综合997久久| 亚洲国产美女精品久久久久∴|