原文中有这样一段话:“。問題在於,即使我的程式有那些類別定義(就
算我的程式和你的程式有㆒樣的內容好了),我能夠這麼做嗎:
char className[30] = getClassName(); // 從檔案(或使用者輸入)獲得㆒個類別名稱
CObject* obj = new classname; // 這㆒行行不通首先,new classname 這個動作就過不了關。其次,就算過得了關,new 出來的物件究
竟該是什麼類別型態?雖然以㆒個指向MFC 類別老祖宗(CObject)的物件指標來容納
它絕對沒有問題,但終不好總是如此吧!不見得這樣子就能夠滿足你的程式需求啊。
顯然,你能夠以Serialize 函式寫檔,我能夠以Serialize 函式讀檔,但我就是沒辦法恢復
你原來的狀態-- 除非我的程式能夠「動態生成」”
1.他说从档桉中生成“CObject* obj = new classname;”这样一个类行不通,为什么?事先写好的类不就是放在档桉中,用的时候new 出来吗?为什么行不通?2.他说的“沒辦法恢復你原來的狀態”是什么意思?这和动态生成有什麽关系?!我把后面的动态生成看过了还没能明白这里的意思!那位朋友能指点一下?先谢了!

解决方案 »

  1.   

    classname是个字符串,like this
     CObject* obj = new "aaa"
    所以行不通
      

  2.   

    为什莫字符串行不通?用了Serialize就行了呢?
      

  3.   


    MFC的那一堆DECLARE_SERIAL等宏 完成了字符串和相应的createObject函数的对应关系,配合Serialize
    读到类名字符串后,就去查表,查到了就使用相应的CreateObject创建对象
      

  4.   

    可我的意思是说如果想得到一个文件上面的类或者变量信息的东西的话,用一个#include<我想得到信息的文件>不就行了吗?为什莫要用到Serialize来读文档?是不是我误解了文章的意思?请指点!
      

  5.   

    光有类的名称,而没有一个类的完整定义,是不能new出一个类对象来的。
      

  6.   

    第一个问题:动态创建一个类,需要调用其构造函数,这里没有,当然行不通。
    第二个问题:其实与前一个一样,其实必须事在先构造了一个对象之后,才能用serialize进行恢复。
      

  7.   

    是不是构造函数无法在内存中编译初始化,所以不能new出来,而序列化和动态生成可以联合解决这个问题?
      

  8.   

    不过用#include<myclass.h>不就行了吗!就可以new了,当然myclass中有事先定义好的类,为什莫还要有个序列化?是不是序列化能读.h和.cpp以外的文件或其他理由?
      

  9.   

    如给你举个例子:////////////////
    #include <iostream.h>class ancestor
      {......};class father : public ancestor
     {.......};class mother : public ancestor
     {.......};class uncle : public ancestor
     {.......};void main()
     {
       char classname[64];
       cout<<"Please input the class name:"<<endl;
       cin>>classname;
       ancestor * newobject = new classname;
       ....
      }  
    ////////////////////
    以上代码定义了4个类,然后要求在运行时根据用户输入的类名来创建一个相应的对象
    那么程序最后一行行得通吗?不行,new后面必须是确定的类型
    也就是说 new 后面必须是字符串常量
    这就是动态生成的困难!其实我们大可这样来解决这个问题:
    ///////////////////////
    #include <iostream.h>class ancestor
      {......};class father : public ancestor
     {.......};class mother : public ancestor
     {.......};class uncle : public ancestor
     {.......};void main()
     {
       char classname[64];
       cout<<"Please input the class name:"<<endl;
       cin>>classname;
       ancestor * Object;
       switch (classname)
         { 
           case "ancestor":
               Object=new ancestor;
               break;
           case "father":
               Object=new father;
               break;
           .........
          }
      }//////////////////可是这样有点苯,MFC通过两个宏把这些封装起来了