在MFC中用DECLARE_DYNCREATE申明一个类可以动态创建.  
 
请问这样做有什么好处,为什么要这样做?  

解决方案 »

  1.   

    声明一动态创建的作用是只要知道类的名字就可以产生一个类的实例。
    这个在产生文档时是很有用的。例如加入当我们使用
    new CMultiDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CChildFram),RUNTIME_CLASS(CMyDocument),RUNTIME_CLASS(CMyView));时传给CMultiDocTemplate的实际上是三个CRuntimeClass的结构。它有一个字符型的字段lpszClassName保存了类的名称。一般情况下它的值是class后面跟类名。另有一个字段pfnCreateObject,就是用类名来产生类的实例的函数。如果没有DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE则pfnCreateObject的值为NULL,加入IMPLEMENT_DYNCREATE实际上就加入了加入了这个函数的实现。因些可以动太产生类的实例。另外在串行化的时候也必须能够动态生成。因为保存动文件中的内容是类的名称。实际上DECLARE_SERIALIZE和IMPLEMENT_SERIALIZE己经包含DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE
      

  2.   

    多谢各位!!to  kingcom_xu(杀不了人的刀,郁闷!):
        不能.
        TCHAR strClass ="CMyClass"
        CMyClass *class =new strClass;
        这样显然是错误的.
        但我们可以这样啊:
        CMyClass *class =new CMyClass;既然已经保护了CMyClass的头文件.上面的语句也可以创建对象啊.为什么一定要用RUNTIME_CLASS(CMyClass)->CreateObject.而不用
        CMyClass *class =new CMyClass;呢.?请多指教.
        
      

  3.   

    这样行不行呢?
    TCHAR strClass ="CMyClass";
    RUNTIME_CLASS(strClass)->CreateObject.是对的吗?
      

  4.   

    TCHAR strClass ="CMyClass"
        CMyClass *class =new strClass;
        这样显然是错误的.
        但我们可以这样啊:
        CMyClass *class =new CMyClass;既然已经保护了CMyClass的头文件.上面的语句也可以创建对象啊.为什么一定要用RUNTIME_CLASS(CMyClass)->CreateObject.而不用
        CMyClass *class =new CMyClass;呢.?
    --------------------
    你怎么就确定字符串的的类是CMyClass呢???虽然"上面的语句也可以创建对象",但如果有字符串中的类名是另一个呢?
    当然你可以这样:
    include所有可能要生成的类的头文件,然后:
    if(strClass=="classA")生成ClassA的实例;
    if(strClass=="ClassB")生成ClassB的实例;但太麻烦,而且代码"不够弹性和优雅"...详细请看深入浅出MFC中jjhou的说法...............
    我对RunTimeClass也不是很了解:)
      

  5.   

    很明显在写程序时,是知道类的名字的,但是考虑下面的情况。现在我打开了一个文档。那么要产生三个类的实例。CChildFrame,CMyDocument,CMyView.那么你如何知道产生这个文档时产生的是CChildFrame,CMyDocument,CMyView而不是其它的什么象CAnotherView这样的类呢.当然我们要保存类的信息,我们才能知道要产生哪几个类。如何保存这些类的信息呢,当然就是用CRuntimeClass了。产生一个CRuntimeClass当然不是
        TCHAR strClass ="CMyClass";
        RUNTIME_CLASS(strClass)->CreateObject.
    一般情况下我们很少用CRuntimeClass的CreateObject来产生一个类的实例。如果一定要这么做,可能像这样
        char szClassName[64];
        CRuntimeClass* pClass;
        cout << "enter a class name... ";
        cin >> szClassName;
       for (pClass = pFirstClass; pClass != NULL;
                 pClass = pClass->m_pNextClass)
    {
        if (strcmp(szClassName, pClass->m_lpszClassName) == 0)
             pClass ->CreateObject();
        break;
    }
      

  6.   

    侯老大的《深入浅出MFC》中有介绍。