• <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: 博客園 模板提供:滬江博客
            久久久久久人妻无码| 天堂无码久久综合东京热| 欧美亚洲色综久久精品国产| 亚洲国产精品无码久久久秋霞2| 久久久久精品国产亚洲AV无码| 久久久一本精品99久久精品88| 日韩人妻无码精品久久免费一| 2021少妇久久久久久久久久| 国产激情久久久久影院老熟女免费| 久久se精品一区精品二区国产 | 久久久久久人妻无码| 久久国产精品久久精品国产| 久久人人超碰精品CAOPOREN | 亚洲国产精品久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区| 久久综合给合综合久久| 久久天堂AV综合合色蜜桃网| 久久高潮一级毛片免费| 97久久精品无码一区二区天美| 污污内射久久一区二区欧美日韩 | 亚洲精品国产第一综合99久久 | 无码人妻精品一区二区三区久久| 精品综合久久久久久97超人| 色妞色综合久久夜夜| 国产一区二区精品久久凹凸| 久久久无码精品亚洲日韩按摩 | 伊人久久无码精品中文字幕| 国产日产久久高清欧美一区| A级毛片无码久久精品免费 | 2020最新久久久视精品爱| 亚洲愉拍99热成人精品热久久 | 婷婷五月深深久久精品| 午夜福利91久久福利| 久久99久久成人免费播放| 国产日韩久久免费影院| 国产一区二区三精品久久久无广告 | 久久综合一区二区无码| 国内精品久久久久久久影视麻豆 | 日本精品一区二区久久久| 亚洲成色999久久网站| 国产精品美女久久久|