MFC CObject简析

来源:互联网 发布:sql replace用法 编辑:程序博客网 时间:2024/05/20 22:28
//VS2008代码如下class AFX_NOVTABLE CObject{public:// Object model (types, destruction, allocation)virtual CRuntimeClass* GetRuntimeClass() const;virtual ~CObject() = 0;  // virtual destructors are necessary// Diagnostic allocationsvoid* PASCAL operator new(size_t nSize);void* PASCAL operator new(size_t, void* p);void PASCAL operator delete(void* p);#if _MSC_VER >= 1200void PASCAL operator delete(void* p, void* pPlace);#endif#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)// for file name/line number tracking using DEBUG_NEWvoid* PASCAL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);#if _MSC_VER >= 1200void PASCAL operator delete(void *p, LPCSTR lpszFileName, int nLine);#endif#endif// Disable the copy constructor and assignment by default so you will get//   compiler errors instead of unexpected behaviour if you pass objects//   by value or assign objects.protected:CObject();private:CObject(const CObject& objectSrc);              // no implementationvoid operator=(const CObject& objectSrc);       // no implementation// Attributespublic:BOOL IsSerializable() const;BOOL IsKindOf(const CRuntimeClass* pClass) const;// Overridablesvirtual void Serialize(CArchive& ar);#if defined(_DEBUG) || defined(_AFXDLL)// Diagnostic Supportvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif// Implementationpublic:static const CRuntimeClass classCObject;#ifdef _AFXDLLstatic CRuntimeClass* PASCAL _GetBaseClass();static CRuntimeClass* PASCAL GetThisClass();#endif};
说明:
_MSC_VER 定义编译器的版本。下面是一些编译器版本的_MSC_VER值:
MS VC++ 12.0 _MSC_VER = 1800 (Visual C++ 2013)
MS VC++ 11.0 _MSC_VER = 1700 (Visual C++ 2012)
MS VC++ 10.0 _MSC_VER = 1600(Visual C++ 2010)
MS VC++ 9.0 _MSC_VER = 1500
MS VC++ 8.0 _MSC_VER = 1400
MS VC++ 7.1 _MSC_VER = 1310
MS VC++ 7.0 _MSC_VER = 1300
MS VC++ 6.0 _MSC_VER = 1200
MS VC++ 5.0 _MSC_VER = 1100


一、运行时类信息

BOOL IsKindOf(const CRuntimeClass* pClass) const;


        该特性用于在运行时确定一个对象是否属于一特定类(是该类的实例),或者从一个特定类派生来的。CObject 提供IsKindOf 函数来实现这个功能。(即在程序代码中可以通过 xxObject.IsKindOf(RUNTIME_CLASS(XXClass))来判断xxObject对象是否是属于XXClass类,或者xxObject是否是从XXClass类派生而来)。


在编写类时候,一定要添加如下东西

        定义该类时,在类说明中使用DECLARE_DYNAMIC(CLASSNMAE)宏;

        在类的实现文件中使用IMPLEMENT_DYNAMIC(CLASSNAME,BASECLASS)宏。


二、动态创建

    就是在运行时由MFC动态创建我们自己指定的类的实例。如:框架窗口对象、视对象,还有文档对象都需要由文档模板类(CDocTemplate)对象来动态的创建。它们并不是当我们需要框架的时候就亲手写上CFrameWnd myFrame;需要视的时候就自己写上CView myView的代码。而是定义该类时,在类说明中我们通过DECLARE_DYNCREATE(CLASSNMAE)宏来告诉MFC框架我们希望它为我们动态创建的类的类名。同时提供一个不带参数的构造函数。再在在类的实现文件中使用IMPLEMENT_DYNCREATE ( CLASSNAME ,BASECLASS)。如此,MFC框架就可以为我们动态创建该类对象了。


三、对象序列化

    “序列化”就是把对象内容存入一个文件或从一个文件中读取对象内容的过程。即是把一个对象的各种相关数据按照某种规则将它们从内存中拿出来存入到临时或永久性存储区中(如文件形式)。而反序列化就是再按照某种规则根据序列化的内容再重新为它分配内存,在内存中把对象状态还原出来的过程。
    定义该类时,在类说明中使用DECLARE_SERIAL(CLASSNMAE)宏;
     定义一个不带参数的构造函数(默认构造函数);
     在类的实现文件中使用IMPLEMENT_SERIAL(CLASSNAME,BASECLASS)宏;
     覆盖Serialize 成员函数。(如果直接调用Serialize 函数进行序列化读写,可以省略前面三步。)

注:要实现这三种特性,都必须以从CObject类继承为基础,然后再是那一系列的宏。此外,对运行时类信息的支持、动态创建的支持、串行化的支持层(不包括直接调用Serailize实现序列化),这三种功能的层次依次升高。如果对后面的功能支持,必定对前面的功能支持。支持动态创建的话,必定支持运行时类信息;支持序列化,必定支持前面的两个功能,因为它们的声明和实现都是后者包含前者。
0 0