您的位置:首页 > 其它

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

2008-10-11 23:25 309 查看
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;
    }
    //利用结构体定义时的构造函数对链表头部进行添加成员处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息