• <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>
            Impossible is nothing  
              愛過知情重醉過知酒濃   花開花謝終是空   緣份不停留像春風來又走   女人如花花似夢
            公告
            日歷
            <2006年4月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456
            統計
            • 隨筆 - 8
            • 文章 - 91
            • 評論 - 16
            • 引用 - 0

            導航

            常用鏈接

            留言簿(4)

            隨筆分類(4)

            隨筆檔案(8)

            文章分類(77)

            文章檔案(91)

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             

            1.CTypedPtrList<CObList, CDrawObj*> 與 std::vector<CDrawObj*>
            如果CDrawObj*從COject繼承用CTypedPtrList優于用std::vector,雖然std::vector很優美,但在
            MFC下,MFC類是大房,std::vector是小妾,很多MFC類的功能std::vector用不了,CTypedPtrList可以.
            比如直接的容器序列化,如果使用std::vector的話,你的工作將很多,保存時需遍歷對象,一個一個保存,讀取時你要知道對象的具體類型(繼承的最末端),然后創建對象,一個一個讀取.

            typedef CTypedPtrList<CObList, CMyObject*>  CMyList;
            CMyList ml;
            CMyObject* pMyObject = new CMyObject();
            ml.AddTail(pMyObject);

            CFileException e;
            CFile myFile;
            myFile.Open("MyFile.txt", CFile::modeCreate|CFile::modeWrite, &e);
            CArchive ar(&myFile, CArchive::store);
            ml.Serialize(ar);

            ar.Close();
            myFile.Close();

            while (!ml.IsEmpty())
            {
               delete ml.GetHead();
               ml.RemoveHead();
            }
            //=====================
            //where CMyObject is defined by the following files:

            //CMyObject.h
            class CMyObject : public CObject
            {
            public:
                 int i;
                 void Serialize(CArchive& ar);
                 CMyObject() { i = 9876;}
            protected:
                 DECLARE_SERIAL(CMyObject)
            };

            //===================
            //CMyObject.cpp
            #include "stdafx.h"
            #include "CMyObject.h"

            IMPLEMENT_SERIAL(CMyObject, CObject, 0) 

            void CMyObject::Serialize(CArchive& ar)
            {
                CObject::Serialize( ar );
                if( ar.IsStoring() )
                     ar << i;
                else
                     ar >> i;
            }
            2.析構函數可以自己調用
            比較吃驚!
            但msdn上是這樣說的
            Calling a destructor explicitly is seldom necessary. However, it can be useful to perform cleanup of objects placed at absolute addresses. These objects are commonly allocated using a user-defined new operator that takes a placement argument. The delete operator cannot deallocate this memory because it is not allocated from the free store . A call to the destructor, however, can perform appropriate cleanup. To explicitly call the destructor for an object, s, of class String, use one of the following statements:
            s.String::~String();     // Nonvirtual call
            ps->String::~String();   // Nonvirtual call

            s.~String();       // Virtual call
            ps->~String();     // Virtual call

            自己測試的代碼
            #include <iostream>

            using namespace std;
            class ExplicitlyCallDesCtor
            {
            public:
             ExplicitlyCallDesCtor()
             {
              cout << "call Constructor" << endl;
             }
             ~ExplicitlyCallDesCtor()
             {
              cout << "call Destructor" << endl;
             }
            private:
             int member;

            };
            int main()
            {
             {
              ExplicitlyCallDesCtor  o;
              cout << "befor Explicitly call" << endl;
              o.~ExplicitlyCallDesCtor();
              cout << "after Explicitly call" << endl;
              cout << "Exit the scope" << endl;
             }
                cout << "Systemc all" << endl;
            }
            結果:
            call Constructor
            befor Explicitly call
            call Destructor
            after Explicitly call
            Exit the scope
            call Destructor
            Systemc all
            microsoft c++ compiler 13 與 GCC 3.4.2下結果相同

            3.注意一個不易發現的死循環
            std::vector<int> IntS;
            ints.pushback(...)
            for (UINT i=IntS.size()-1;i>=0;i--)
            {
            ....
            }


             

            posted on 2006-03-03 16:45 笑笑生 閱讀(1325) 評論(3)  編輯 收藏 引用
            評論:
            • # re: 工作中發現的  …… Posted @ 2006-03-03 16:54
              3.注意一個不易發現的死循環
              無語了……
              無符號數當然不小于0了  回復  更多評論   

            • # re: 工作中發現的  蟲子 Posted @ 2006-03-03 16:57
              STL的序列化可以參看一下boost的序列化庫。
              如果你的工作都是在windows下的話,MFC是一個非常合適而且有效的庫平臺。
                回復  更多評論   

            • # re: 工作中發現的  Stone Jiang Posted @ 2006-04-13 09:17
              0也屬于無符號數呀   回復  更多評論   

             
            Copyright © 笑笑生 Powered by: 博客園 模板提供:滬江博客
            亚洲中文精品久久久久久不卡| 少妇久久久久久久久久| 精品亚洲综合久久中文字幕| 久久精品午夜一区二区福利| 99国内精品久久久久久久| 久久国产免费| 久久99久久99精品免视看动漫| 丰满少妇人妻久久久久久| 久久久久噜噜噜亚洲熟女综合| 中文字幕精品久久| 好属妞这里只有精品久久| 亚洲国产天堂久久综合| 久久91亚洲人成电影网站| 久久经典免费视频| 93精91精品国产综合久久香蕉| 国产成人综合久久精品红| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 波多野结衣久久| 18岁日韩内射颜射午夜久久成人 | 久久亚洲AV无码西西人体| 无码人妻久久一区二区三区免费丨| 久久这里只有精品久久| 久久天天躁狠狠躁夜夜avapp| 97香蕉久久夜色精品国产| 久久精品国产99久久久香蕉| 精品国际久久久久999波多野| 久久久久免费精品国产| 精品无码久久久久久久久久| 99久久精品国产高清一区二区 | 国产91色综合久久免费分享| 婷婷久久五月天| 亚洲国产天堂久久久久久| 久久免费大片| 久久996热精品xxxx| 99久久成人18免费网站| 94久久国产乱子伦精品免费| 久久精品国产精品青草app| 国产精品一区二区久久精品| 久久久亚洲欧洲日产国码aⅴ | 99精品久久久久久久婷婷| 久久久久久久99精品免费观看|