1.什么是动态创建?
通俗的说,动态创建就是在程序运行时创建指定类的对象。MFC AppWizard创建的单文档程序中就动态创建了框架窗口对象、文档对象和视图对象。
2.动态创建的作用?
动态创建在程序需要的时候才会创建指定的类对象,这样用户就可以使用VC提供好的模版根据自己的需要生成相应的类,就不会多出没有用的对象了,节省了编译的时间。在MFC中动态创建应用很常见。
3.动态创建
3.1 获取动态创建对象的类名
要想动态创建一个对象,就需要获得将要动态创建的类的类名。上一篇中的类型识别,已经可以使用IsKindOf得到类的名字。
如果我能够把类的大小记录在类型录中,把构造函数(注意,这里并非指 C++构造函数,而是指即将出现的 CRuntimeClass::CreateObject)也记录在类型录中,当程序在执行时期获得一个类名称,它就可以在「类型录网」中找出对应的元素,然后调用其构造函数(这里并非指 C++构造函数),产生出对象。
类型录网的元素型式CRuntimeClass于是有了变化:
struct CRuntimeClass
{
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema;
CObject* (PASCAL* m_pfnCreateObject)();
CRuntimeClass* m_pBaseClass;
CObject* CreateObject();
static CRuntimeClass*PASCAL load();
static CRuntimeClass*pFirstClass;
CRuntimeClass* m_pNextClass;
};
3.2 构成链表
上一篇中已经构成了一个类型识别的链表。因为CRuntimeClass中新增加成员变量,所以增加两个宏。
#define DECLARE_DYNCREATE(classname)\
DECLARE_DYNAMIC(classname) \
static CObject*PASCAL CreateObject();
#define IMPLEMENT_DYNCREATE(classname,base_class_name)\
CObject* PASCALclass_name::CreateObject() \
{returnnew class_name;} \
_IMPLEMENT_RUNTIMECLASS(clasname,base_class_name,0xffff,class_name::CreateObject)
链表节点图示: