|
5.3.2 动态创建
视频精讲:光盘\video\05\动态创建.swf
动态创建同样需要CRuntimeClass对象的支持,它指的是在运行的过程中以某个类为蓝本,通过调用CRuntimeClass对象的成员函数CreateObject()完成对象的动态创建工作。
实现动态创建的方法与实现RTTI的方法类似,只是要将DECLARE_DYNAMIC()宏和IMPLEMENT_DYNAMIC()宏分别替换为DECLARE_DYNCREATE()宏和IMPLEMENT_DYNCREATE()宏,替换后代码的形式如下:
//*.h //为C***Class1类添加对动态创建的支持 class C***Class1 : public C***Class { DECLARE_DYNCREATE(C***Class1) …… }; //*.cpp IMPLEMENT_DYNCREATE(C***Class1, C***Class) | 其中,宏DECLARE_DYNCREATE()的作用是提供动态创建的声明。在afx.h头文件下,宏DECLARE_DYNCREATE()的定义如下:
#define DECLARE_DYNCREATE(class_name) \ DECLARE_DYNAMIC(class_name) \ 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) | 从上述宏定义中可知,DECLARE_DYNCREATE()宏包含了DECLARE_DYNAMIC()宏,并在此基础上定义了一个静态成员函数CreateObject(),该函数使用C++(www.cppentry.com)操作符和类的默认构造函数为其所属类动态创建一个对象。而IMPLEMENT_DYNCREATE()宏则用于实现类对象的动态创建。因此,在进行宏替换后,实现动态创建的操作实际上为:
//*.h //为C***Class1类添加对动态创建的支持 class C***Class1 : public C***Class { protected: static CRuntimeClass* _GetBaseClass(); public: static const CRuntimeClass classC***Class1; static CRuntimeClass* GetThisClass(); virtual CRuntimeClass* GetRuntimeClass() const; static CObject* PASCAL CreateObject(); }; //*.cpp CObject* PASCAL C***Class1::CreateObject() { return new C***Class1; } static char lpszClassName[] = "C***Class1"; CRuntimeClass C***Class1::class C***Class1 = { _lpszClassName, sizeof(C***Class1), 0xFFFF, C***Class1::CreateObject, (CRuntimeClass*)(&C***Class1::classC***Class1), NULL, NULL }; CRuntimeClass* C***Class1::GetRuntimeClass() const { return (CRuntimeClass*)(&C***Class1::classC***Class1); } | 至此,我们可以看出,MFC为支持动态创建所采用的机制是:首先,通过DECLARE_DYNCREATE()宏为动态创建进行声明;然后,IMPLEMENT_DYNCREATE()宏会把CreateObject()函数的入口地址作为初始化参数传递给CRuntimeClass对象的m_pfnCreateObject成员变量,在CRuntimeClass:: CreateObject()内部将调用该成员所指向的CreateObject()函数,这样,就完成了类对象的创建工作。
由于DECLARE_DYNCREATE()宏中包含了DECLARE_DYNAMIC()宏,所以,所有支持动态创建的类都必然支持运行时的类型识别。
【责任编辑: 云霞 TEL:(010)68476606】
|