在<<精通MFC>>中P111页:
C++语言不支持动态创建,但CObject提供了动态创建对象的能力.//动态创建
CRuntimeClass *pRuntimeClass =RUNTIME_CLASS(CPerson)
CObject *pObject=pRuntimeClass->CreateObject();
ASSERT(pOject->IsKindOf(RUNTIME_CLASS(CPerson)));
CPerson *pPerson2=static_cast<CPerson*>(pObject);
//
pPerson2->m_firstName="xiaohua";
pPerson2->m_lastName="Liu";
delete pPerson2;
疑问一:
MFC是不是多此一举了,为什么不直接用?
CPerson* pPerson2=new CPerson;
pPerson2->m_firstName="xiaohua";
pPerson2->m_lastName="Liu";
delete pPerson2;
疑问二:
C++中不可以用new Class吗?

解决方案 »

  1.   

    这里的动态创建不是new,是指根据类名创建对象。
    比如给你一个类叫CMyClass1,你可以CMyClass1 my = new CMyClass1;
    但是如果有一系列的类CMyClass1 ~ CMyClassN,
    让你根据类名创建相应的对象你怎么办。 \
    "CMyClassN" my = new "CMyClassN";//是不被支持的
    你可能会想到用一堆select case语句判断类名字符串,
    但有时候你都不知道你要创建的类会是什么,select case只能是列举已有的类。
      

  2.   

    动态创建就是运行时创建指定类的对象,在MFC中大量使用。如框架窗口对象、视对象,还有文档对象都需要由文档模板类对象来动态的创建。  1、定义一个不带参数的构造函数(默认构造函数);因为我们是用CreateObject()动态创建,它只有一条语句就是return new XXX,不带任何参数。所以我们要有一个无参构造函数。  2、类说明中使用DECLARE_DYNCREATE(CLASSNMAE)宏;和在类的实现文件中使用IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)宏;这个宏完成构造CRuntimeClass对象,并加入到链表中。  3、使用时先通过宏RUNTIME_CLASS得到类的RunTime信息,然后使用CRuntimeClass的成员函数CreateObject创建一个该类的实例。  4、CObject* pObject = pRuntimeClass->CreateObject();//完成动态创建。共2页。 9 7 1 2
      

  3.   

    动态创建,有可能CPerson得类型在另一个模块(dll),而在你的程序里面需要创建它的对象,没有头文件,拿不到类型信息,通过CRuntimeClass 可以创建
      

  4.   

    明白了
    非常感谢coolzdp(unreal张师傅),huamoran(花蓦然),wlwlxj(wlwlxj)!
    谢谢songlife33(roger) 关注.
    结贴了