MFC关键技术模拟(5)------动态创建

上一篇:MFC关键技术模拟(4)-----类型识别

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)

链表节点图示:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值