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--)
{
....
}