设为首页 加入收藏

TOP

5.3.2 动态创建
2013-10-07 00:45:29 来源: 作者: 【 】 浏览:53
Tags:5.3.2 动态 创建

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】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇5.3.3 序列化 下一篇5.3.1 RTTI

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: