• <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
            統(tǒng)計
            • 隨筆 - 8
            • 文章 - 91
            • 評論 - 16
            • 引用 - 0

            導航

            常用鏈接

            留言簿(4)

            隨筆分類(4)

            隨筆檔案(8)

            文章分類(77)

            文章檔案(91)

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             

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

            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.析構函數(shù)可以自己調用
            比較吃驚!
            但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.注意一個不易發(fā)現(xiàn)的死循環(huán)
            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: 工作中發(fā)現(xiàn)的  …… Posted @ 2006-03-03 16:54
              3.注意一個不易發(fā)現(xiàn)的死循環(huán)
              無語了……
              無符號數(shù)當然不小于0了  回復  更多評論   

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

            • # re: 工作中發(fā)現(xiàn)的  Stone Jiang Posted @ 2006-04-13 09:17
              0也屬于無符號數(shù)呀   回復  更多評論   

             
            Copyright © 笑笑生 Powered by: 博客園 模板提供:滬江博客
            国产A级毛片久久久精品毛片| 久久久久99精品成人片试看| 99久久综合狠狠综合久久| 国产91色综合久久免费| 久久影视国产亚洲| 久久无码av三级| 久久久噜噜噜www成人网| 久久精品视频网| 久久午夜伦鲁片免费无码| 久久最新免费视频| 777米奇久久最新地址| 久久久久99精品成人片牛牛影视| 精品久久久久久亚洲精品| 亚洲国产另类久久久精品黑人| 日日狠狠久久偷偷色综合免费| 99久久精品国产高清一区二区| 精品久久久久久无码人妻热| 99久久精品免费| 激情综合色综合久久综合| 亚洲va久久久噜噜噜久久天堂| 激情综合色综合久久综合| 亚洲欧美伊人久久综合一区二区| 久久婷婷久久一区二区三区| 少妇人妻综合久久中文字幕| 无码八A片人妻少妇久久| 久久精品国产亚洲精品| 国产91色综合久久免费分享| 中文国产成人精品久久不卡| 久久棈精品久久久久久噜噜| 无码8090精品久久一区| 丁香久久婷婷国产午夜视频| 精品熟女少妇a∨免费久久| 国产美女亚洲精品久久久综合| 色诱久久av| 亚洲国产精品成人AV无码久久综合影院| 色狠狠久久综合网| A狠狠久久蜜臀婷色中文网| 久久中文骚妇内射| 久久综合九色综合网站| 久久亚洲春色中文字幕久久久| 亚洲中文久久精品无码ww16|