MFC动态创建

 

    动态创建是CObject提供的第二大特性。创建一个类对象,new运算符就可以了。动态创建以RTCI为基础,根据类的CRuntimeClass来创建对象,主要用于对序列化的支持。

 

    使用动态创建的步骤:

1、  CObject派生。

2、  类声明中添加DECLARE_DYNCREATE宏,类实现中添加IMPLEMENT_DYNCREATE

 

示例:

// myclass.h class CMyClass : public CObject { DECLARE_DYNCREATE(CMyClass); }; // myclass.cpp IMPLEMENT_DYNCREATE(CMyClass, CObject);  

用法:

1、  获取类的CRuntimeClass指针

2、  调用CRuntimeClass::CreateObject,创建类对象。

CMyClass* pMyClass1 = (CMyClass*)((RUNTIME_CLASS(CMyClass))->CreateObject());  

 解析:

    DECLARE_DYNCREATE声明了动态创建,它在RTCI基础上添加了一个静态成员函数CreateObject,这个成员函数是属于类的。它调用new运算符来生成新的对象。

    DECLARE_DYNCREATE定义如下:

#define DECLARE_DYNCREATE(class_name) / DECLARE_DYNAMIC(class_name) / static CObject* PASCAL CreateObject(); // 宏展开 public: static const CRuntimeClass classCMyClass; virtual CRuntimeClass* GetRuntimeClass() const; static CObject* PASCAL CreateObject();  

IMPLEMENT_DYNCREATE定义如下:

#define IMPLEMENT_DYNCREATE(class_name, base_class_name) / CObject* PASCAL class_name::CreateObject() / { return new class_name; } / IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, / class_name::CreateObject, NULL) // 宏展开 const CRuntimeClass CMyClass::classCMyClass = { "CMyClass", sizeof(class CMyClass), 0xFFFF, CMyClass::CreateObject, RUNTIME_CLASS(CObject), NULL, NULL }; CRuntimeClass* CMyClass::GetRuntimeClass() const { return RUNTIME_CLASS(CMyClass); } CObject* CMyClass::CreateObject() { return new CMyClass; } // 类的CreateObject调用new创建新对象  

    RTCI相比,在CRuntimeClass中,动态创建多填写了一个成员变量m_pfnCreateObject,它是一个函数指针:

    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class

用于指向类的CreateObject函数,在本例中传入的是CMyClass::CreateObject,这个函数是个静态成员函数。

 

    动态创建的主要思想是从类的CRuntimeClass创建类对象,它调用CRuntimeClass::CreateObject函数。

CObject* CRuntimeClass::CreateObject() // 通过CRuntimeClass创建类对象。 { // 动态创建中填写了该函数指针为CMyClass::CreateObject,它是个静态函数 if (m_pfnCreateObject == NULL) return NULL; CObject* pObject = NULL; pObject = (*m_pfnCreateObject)(); return pObject; }  

 

你可能感兴趣的:(null,Class,mfc,pascal)