MFC六大机制(五)动态创建机制

一、作用:动态创建对象

二、使用

1、必须直接或间接继承CObject类

2、类内添加声明宏DECLARE_DYNCREATE(CDog)

3、类外添加实现宏DECLARE_DYNCREATE(CDog, CAnimal)

三、具体实例

 1 class CAnimal : public CObject
 2 {
 3     DECLARE_DYNCREATE(CAnimal)
 4 }; 
 5 IMPLEMENT_DYNCREATE(CAnimal, CObject)
 6 
 7 class CDog : public CAnimal
 8 {
 9     //DECLARE_DYNCREATE(CDog)
10     //DECLARE_DYNAMIC(CDog) 
11 public: 
12     static const AFX_DATA CRuntimeClass classCDog; 
13     virtual CRuntimeClass* GetRuntimeClass() const; 
14     static CObject* PASCAL CreateObject();
15 }; 
16 //IMPLEMENT_DYNCREATE(CDog, CAnimal)
17 CObject* PASCAL CDog::CreateObject() 
18 { 
19     return new CDog; 
20 } 
21 
22 //IMPLEMENT_RUNTIMECLASS(CDog, CAnimal, 0xFFFF, CDog::CreateObject)
23 AFX_COMDAT const AFX_DATADEF CRuntimeClass CDog::classCDog = 
24 { 
25     "CDog", 
26     sizeof(class CDog),
27     0xFFFF, 
28     CDog::CreateObject, 
29     RUNTIME_CLASS(CAnimal),
30     NULL 
31 }; 
32 
33 CRuntimeClass* CDog::GetRuntimeClass() const 
34 { 
35     return RUNTIME_CLASS(CDog); 
36 } 
37 
38 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
39 {
40     CObject *Obj = RUNTIME_CLASS(CDog)->CreateObject();
41     if (Obj->IsKindOf(RUNTIME_CLASS(CDog)))
42     {
43         printf("Obj is the object of CDog\n");
44     }
45     else
46     {
47         printf("Obj isn't the object of CDog\n");
48     }
49     return 0;
50 }

从实例可以看出,动态创建机制和运行时类信息机制查差不多,无非就多了一个静态成员函数,用于创建对象,并返回

对象地址,还有就是运行时类信息结构体的第四个成员不再为NULL,而是保存了一个静态成员函数的地址。

四、伪代码

1 CObject *Obj = RUNTIME_CLASS(CDog)->CreateObject();
2 {
3     pObject = (*m_pfnCreateObject)();
4     {
5         return new CDog; 
6     }
7 }

 

posted @ 2014-01-08 02:06  the beginner of C++  阅读(468)  评论(0编辑  收藏  举报