VC中DELCLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏的完整含意和用法

       MFC为了达到RTTI的功能实现使用了CRunTimeClass类,该类记录必要的信息,以便建立型录,用链表来实现,CRunTimeClass的成员变量类的名称,链表的First指针和Next指针。
      MFC为了把CRunTimeClass放进类中,就主要使用了DELCLARE_DYNAMICIMPLEMENT_DYNAMIC宏。
 
#define RUNTIME_CLASS(class_name)(&class_name::class##class_name)其中class##class_name为类中
 
#define DECLARE_DYNAMIC(class_name) /
public: /
        static CRuntimeClass class##class_name; /
        virtual CRuntimeClass* GetRuntimeClass() const; 
 
CRuntimeClass结构体变量,##告诉编译器把class和class_name连接起来。
 
DECLARE_DYNAMIC作用:声明类中的静态CRuntimeClass变量,使这个类中的所有对象共享。以前学习到静态变量但是不知为何用,现在在这里用到了。
 
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) ///这就是IMPLEMENT_DYNAMIC完成的功能
        _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
 
其中_IMPLEMENT_RUNTIMECLASEE也是一个宏。
#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) /  此为换行符
        static char _lpsz##class_name[] = #class_name; /把类名格式化为字符串,这是静态的数据成员,类的所有对象共享
        CRuntimeClass class_name::class##class_name = { /
                _lpsz##class_name类名,以零结束的字符串,
                sizeof(class_name)//大小, wSchem//版本号a, pfnNew, /
                        RUNTIME_CLASS(base_class_name), NULL }; /
        static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); /加入链表
        CRuntimeClass* class_name::GetRuntimeClass() const /
                { return &class_name::class##class_name; } /
其中AFX_CLASSINIT是一个结构体,它表示一个构造函数。
struct AFX_CLASSINIT
        { AFX_CLASSINIT(CRuntimeClass* pNewClass); };//声明
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)//定义
{
        pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
        CRuntimeClass::pFirstClass = pNewClass;
}
 
例子:在MFC中经常会用到这两个宏。
//在头文件
class CView : public CWnd
{
                DECLARE_DYNAMIC(CView) //在MFC中实际是显示                                                                   DECLARE_DYNCREATE
                 ...
};
//在实现文件
IMPLEMENT_DYNAMIC(CView,CWnd) //在MFC中实际是显示                                                                IMPLEMENT_DYNCREATE
将两个宏展开就可以简单建构数据并完成加入链表的工作。
总结于《深入浅出MFC》
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值