zoukankan      html  css  js  c++  java
  • 框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

           框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

    通过昨天的讲解,我们已经理解了运行时类型识别是什么.

    比如  CObject * pthis = (Cobject *)CreateObject("xxxx"); 这样通过字符串创建的方式是运行时类型创建.

    只不过昨天为了讲解它的前半部分,举了一个简单的例子.

    运行时类型识别,就是把我们的类名,和基类地址保存起来. 从一个链表中保存起来.

    运行时类型创建就是把这个每个类的信息,在建立一张表来保存起来.

    比如昨天我们写的

    class CMyRuntimeClass
    {
    public:
      // Attributes
      LPCSTR m_lpszClassName;        //名字
      int m_nObjectSize;           //对象大小
      UINT m_wSchema;            //版本号
      CMyObject* (*m_pfnCreateObject)();  //创建对象的函数指针
      CMyRuntimeClass* m_pBaseClass;    //基类
      CMyRuntimeClass* m_pNextClass;    //下一个基类
      void *pInit;              //初始化数据
    };

    这个每个类都要初始化.且每个类初始化的时候,填写自己的类名.  创建对象的函数指针等等.

    我们现在要做的就是把它在建立一张表保存起来.

    1.创建链表,保存CRuntimeClass的信息

    2.每次都要进行初始化,所以建立一个类专门进行初始化

    置于为什么要新建立一个类进行初始化

    是这样的.

    我们用户建立的类,需要加入到这个链表中保存起来,但是要怎么保存?

    1.构造中加入链表?

      不行,这样每次new 对象就加一次很麻烦

    2.全局变量加链表,保证每次加入一个.

      可以,但是会遇到作用域的问题.

    class CMyClassInit
    {
    public:
      CMyClassInit(CMyRuntimeClass* pRuntimeClass)
      {
        g_RuntimeList.push_back(pRuntimeClass);      //每次运行,加入到链表中.
      }
      ~CMyClassInit()
      {
      }
    };

    只需要变为静态的成员,既可加入到链表中.

    因为静态成员太多,所以封装为了宏.

    声明宏

    所以支持动态创建的实现宏

    只需要用户自己的类(除了theapp),以及所有支持动态创建的类(凡是继承CWND的类都要支持动态创建)

    加上声明宏和实现宏既可.

    使用RTTI动态创建.

    1.提供根据名称创建对象的函数(在WMain)

    CMyObject *CreateMyObj(const char *pClsName)
    {
      //遍历
      for (MyIterator it = g_RuntimeList.begin();
           it != g_RuntimeList.end();
           it++)
      {
        CMyRuntimeClass *pRuntimeClass = *it;
        if (strcmp(pRuntimeClass->m_lpszClassName, pClsName) == 0)
        {
          if (pRuntimeClass->m_pfnCreateObject != NULL)
            return pRuntimeClass->m_pfnCreateObject();
        }
      }
      
      return NULL;
    }

    其内部就是遍历我们的链表信息,取得每一个类的CreateObj.

    2.调用动态创建.

    置于用户的类,在一开始生成类向导的时候才进行填写.

  • 相关阅读:
    centos7 安装jdk 1.8
    CentOS查看Java进程并部署jar包
    Mybatis传多个参数(三种解决方案)
    mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法
    在Linux上安装tomcat和JDK
    Linux下部署springboot项目的步骤及过程
    maven安装第三方jar包到本地仓库
    Android 开源动画框架:NineOldAndroids
    Android多国语言的value文件夹命名方式
    C++编程经验-返回局部变量的讨论(转)
  • 原文地址:https://www.cnblogs.com/iBinary/p/8077419.html
Copyright © 2011-2022 走看看