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 }


浙公网安备 33010602011771号