框架原理第三讲,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.调用动态创建.

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

原文地址:https://www.cnblogs.com/iBinary/p/8077419.html