zoukankan      html  css  js  c++  java
  • DECLARE_DYNAMIC

    DECLARE_DYNAMIC(class_name)

    DECLARE_DYNCREATE 包含了DECLARE_DYNAMIC的功能,并且可以在运行过程中动态创建对象。如果需要动态创建类对象,需要使用这个宏定义。

        IMPLEMENT_DYNAMIC是实现“运行时类型识别”宏,与之相对应的是DECLARE_DYNAMIC(声明“运行时类型识别”宏)。也就是说你在.CPP文件中如果看见有IMPLEMENT_DYNAMIC,则在.H文件中必定有DECLARE_DYNAMIC的声明。 
    DECLARE_DYNAMIC/DEClARE_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏。 
    DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE是为了“动态创建"类的实例而定义的宏。new可以用来创建对象,但不是动态的。比如说,你要在程序中实现根据拥护输入的类名来创建类的实例,下面的做法是通不过的: 
    char szClassName[60]; 
    cin >> szClassName; 
    CObject* pOb=new szClassName; //通不过 
    这里就要用到DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE定义的功能了。

    定义:

    //////////////////////////////////////////////////////////////////////////////
    // Helper macros for declaring CRuntimeClass compatible classes

    #ifdef _AFXDLL
    #define DECLARE_DYNAMIC(class_name) /
    protected: /
        static CRuntimeClass* PASCAL _GetBaseClass(); /
    public: /
        static const CRuntimeClass class##class_name; /
        static CRuntimeClass* PASCAL GetThisClass(); /
        virtual CRuntimeClass* GetRuntimeClass() const; /

    #define _DECLARE_DYNAMIC(class_name) /
    protected: /
        static CRuntimeClass* PASCAL _GetBaseClass(); /
    public: /
        static CRuntimeClass class##class_name; /
        static CRuntimeClass* PASCAL GetThisClass(); /
        virtual CRuntimeClass* GetRuntimeClass() const; /

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

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

    #endif

    引用:

    DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC

    #define DECLARE_DYNAMIC(class_name)/    
    public:/
        static CRuntimeClass class##class_name;/
        //声明一个类型为CRuntimeClass的静态public成员变量,变量名是由字符串"class"
        //与所指定的类的类名组成。举例而言,如果你写DECLARE_DYNAMIC(CMyView),则等于声明了一个
        // static CRuntimeClass classCMyView静态变量

        virtual CRuntimeClass* GetRuntimeClass() const;/
        //声明一个虚函数,函数名为GetRuntimeClass,返回值为CRuntimeClass类型的指针
        //无参数,并且是个const函数

    #define IMPLEMENT_DYNAMIC(class_name,bass_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;/
        //定义一个C类型字符串静态变量,变量名由"_lpsz"和指定类的类名组成,变量值为该指定类型的名字
        //比如是CMyView,那么定义的就是static char _lpszCMyView="CMyView";

        CRuntimeClass class_name::class##class_name = {/
            _lpsz##class_name,sizeof(class_name),wSchema,pfnNew,/
                RUNTIME_CLASS(base_class_name),NULL};/
        //给之前在DECLARE_DYNAMIC里定义的CRuntimeClass类型的静态成员变量赋值
        //当然,除最后一个m_pNextClass没有赋值(赋值为NULL,它由下面的结构处理)

        static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);/
        //初始化一个名为"_init_##class_name"的AFX_CLASSINIT静态结构,主要作用是给指定的class_name的
        //class##class_name静态变量的最后一个成员m_pNextClass赋值,具体见下面解释AFX_CLASSINIT中

        CRuntimeClass* class_name::GetRuntimeClass() const/
            { return &class_name::class##class_name;}/
        //之前在DECLARE_DYNAMIC里定义的GetRuntimeClass的实现,很简单,就一个return语句。

    #define RUNTIME_CLASS(class_name)/
            (&class_name::class##class_name)
    //这部分之所以单独define出一个宏,主要是为了方便从某个指定的class直接得到它的CRuntimeclass静态成员

    //以下是解释AFX_CLASSINIT结构,注意,这不是一个宏
    //为了看得更加清楚,我按照struct定义的惯常格式来写这个struct的定义
    struct AFX_CLASSINIT {
        AFX_CLASSINIT(CRuntimeClass *pNewClass);
    };

    AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass)
    {
        pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
        //让m_pNextClass指向pFirstClass所指的CRuntimeClass变量

        CRuntimeClass::pFirstClass = pNewClass;
        //让pFirstClass指向pNewClass所指的变量,也就是本class的CRuntimeClass静态变量
    }

  • 相关阅读:
    SQL反模式学习笔记16 使用随机数排序
    SQL反模式学习笔记21 SQL注入
    SQL反模式学习笔记22 伪键洁癖,整理数据
    SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
    SQL反模式学习笔记19 使用*号,隐式的列
    SQL反模式学习笔记17 全文搜索
    SQL反模式学习笔记20 明文密码
    (可发送)亿级流量APP,是怎么做前端性能测试自动化的?
    测试窝 高薪测试必备技能和 20+ 项目实战精华,好书免费领(限前 1000 名)!
    同样是断言,为何 Hamcrest 如此优秀?测试灵魂三问,该如何回答?
  • 原文地址:https://www.cnblogs.com/xzh1993/p/4692713.html
Copyright © 2011-2022 走看看