MFC:关键技术之执行时型别标志(RTTI)

1、CRuntimeClass结构

     型录中的类别信息,以串行(linked list)方式串接起来,形成一个链表。

    一个结构,内中至少需有类别名称、串行的Next 指针,以及串行的First 指针。由于First 指针属于全域变量,一份就好,所以它应该以static 修饰之。

struct CRuntimeClass
 {
    // Attributes
    LPCSTR m_lpszClassName;
    int m_nObjectSize;
    UINT m_wSchema; // schema number of the loaded class
    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
    CRuntimeClass* m_pBaseClass;// 指向当前对象的基类,由该成员列遍的的链表是一个类寻基线路,此线路与程序设计的核心思想直接相关

    static CRuntimeClass* pFirstClass; //链表头部,最后一个加入链表的类
    CRuntimeClass* m_pNextClass; // 所有之前已注册类都应该在此成员开始列遍的链表中,此链路不一定一成不变

};

2、DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC宏

    #define DECLARE_DYNAMIC(class_name) /
                public: /
                static CRuntimeClass class##class_name; /
                virtual CRuntimeClass* GetRuntimeClass() const;

 

        DECLARE_DYNAMIC用于在类中定义一个本类的CRuntimeClass结构

        及一个获得该类的CRuntimeClass型别结构的函数

    #define IMPLEMENT_DYNAMIC(class_name, base_class_name) /
                    _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)

 

    #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), wSchema, pfnNew, /
                    RUNTIME_CLASS(base_class_name), NULL }; /

                    //填充CRuntimeClass结构
                    static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); /
                    CRuntimeClass* class_name::GetRuntimeClass() const /
                    { return &class_name::class##class_name; }

                            //定义GetRuntimeClass()

 

    #define RUNTIME_CLASS(class_name) /
                    (&class_name::class##class_name)

 

 

    struct AFX_CLASSINIT
                    { AFX_CLASSINIT(CRuntimeClass* pNewClass); };

 

    AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
    {
        pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
        CRuntimeClass::pFirstClass = pNewClass;
    }

    //利用结构体定义时的构造函数对链表头部进行添加成员处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值