MFC深入浅出--动态创建

 
Dynamic Creation(动态创建)
 程序执行期间,根据动态获得一个类名称,要求程序产生一个对象。“类别型录网”为此提供了基础。如果能够把类的大小记录在类别型录中,把建构函数(不是C++的构造函数,而是指即将出现的CRuntimeClass::CreateObject())也记录在类别型录中,当程序在执行期获得一个类名称,它就可以在“类别型录网”中找出对应的元素,然后调用其建构函数,产生出对象。
类别型录网的元素CRuntimeClass于是发生变化:
Struct CruntimeClass
{
 //Attributes
    LRCSTR m_lpnzClassName;
    Int m_nObjectSize;
UINT m_wSchema; //schema number of the loaded class
CObject *(PASCAL * m_pfnCreateObject)();//NULL=>abstract class
CRuntimeClass *m_pBaseClass;
CObject *CreateObject();
Static CRuntimeClass *PASCAL Load();
//CruntimeClass objects linked together in the simple list
static CRuntimeClass *pFirstClass;
CRuntimeClass * m_pNextClass;
};
 
DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏
 为了适应CRuntimeClass中新增的成员变量,再新添加两个宏。DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE:
#define DECLARE_DYNCREATE(class_name) /
        DECLARE_DYNAMIC(class_name) /
        Static CObject *PASCAL CreateObject();
#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)
以CframeWnd为例,程序如下:
class CframeWnd : public CWnd
{
    DECLARE_DTNCREATE(CFrameWnd);
   
};
IMPLEMENT_DYNCREATE(CframeWnd,CWnd)
展开如下:
class CframeWnd : public CWnd
{
 public:
    static CRuntimeClass ClassCFrameWnd;
    virtual CRuntimeClass *GetRuntimeClass() const;
    static CObject *PASCAL CreateObject();
   
};
CObject *PASCAL CframeWnd;;CreateObject()
{   return new CframeWnd; }
static char _lpszCFrameWnd[] = CFrameWnd ;
CRuntimeClass CframeWnd::classCFrameWnd = { _lpszCFrameWnd,sizeof(CFrameWnd),
           0XFFFF,CframeWnd::CreateObject,RUNTIME_CLASS(CWnd),NULL };
static AFX_CLASSINIT _init_CframeWnd(&CframeWnd::classCFrameWnd);
CRuntimeClass * CframeWnd::GetRuntimeClass() const
{ return &CframeWnd::classCFrameWnd;}
从宏的定义可以清楚的看到,拥有动态创建(Dynamic Creation)能力的类库,必然拥有RTTI能力.因为_DYNCREATE宏覆盖了_DYNAMIC宏.
 
范例程序
MFC.H
#define BOOL int
#define TURE 1
#define FALSE 0
#define LPCSTR LPSTR
#define char * LPSTR;
#define UINT int
#define PASCAL _stdcall
#define TRACE1 printf
#include <iostream.h>
#include <stdio.h>
#include <string.h>
class CObject
Struct CruntimeClass
{
 //Attributes
    LRCSTR m_lpnzClassName;
    Int m_nObjectSize;
UINT m_wSchema; //schema number of the loaded class
CObject *(PASCAL * m_pfnCreateObject)();//NULL=>abstract class
CRuntimeClass *m_pBaseClass;
CObject * CreateObject();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值