动态创建是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; }