原文中有这样一段话:“。問題在於,即使我的程式有那些類別定義(就
算我的程式和你的程式有㆒樣的內容好了),我能夠這麼做嗎:
char className[30] = getClassName(); // 從檔案(或使用者輸入)獲得㆒個類別名稱
CObject* obj = new classname; // 這㆒行行不通首先,new classname 這個動作就過不了關。其次,就算過得了關,new 出來的物件究
竟該是什麼類別型態?雖然以㆒個指向MFC 類別老祖宗(CObject)的物件指標來容納
它絕對沒有問題,但終不好總是如此吧!不見得這樣子就能夠滿足你的程式需求啊。
顯然,你能夠以Serialize 函式寫檔,我能夠以Serialize 函式讀檔,但我就是沒辦法恢復
你原來的狀態-- 除非我的程式能夠「動態生成」”
1.他说从档桉中生成“CObject* obj = new classname;”这样一个类行不通,为什么?事先写好的类不就是放在档桉中,用的时候new 出来吗?为什么行不通?2.他说的“沒辦法恢復你原來的狀態”是什么意思?这和动态生成有什麽关系?!我把后面的动态生成看过了还没能明白这里的意思!那位朋友能指点一下?先谢了!
算我的程式和你的程式有㆒樣的內容好了),我能夠這麼做嗎:
char className[30] = getClassName(); // 從檔案(或使用者輸入)獲得㆒個類別名稱
CObject* obj = new classname; // 這㆒行行不通首先,new classname 這個動作就過不了關。其次,就算過得了關,new 出來的物件究
竟該是什麼類別型態?雖然以㆒個指向MFC 類別老祖宗(CObject)的物件指標來容納
它絕對沒有問題,但終不好總是如此吧!不見得這樣子就能夠滿足你的程式需求啊。
顯然,你能夠以Serialize 函式寫檔,我能夠以Serialize 函式讀檔,但我就是沒辦法恢復
你原來的狀態-- 除非我的程式能夠「動態生成」”
1.他说从档桉中生成“CObject* obj = new classname;”这样一个类行不通,为什么?事先写好的类不就是放在档桉中,用的时候new 出来吗?为什么行不通?2.他说的“沒辦法恢復你原來的狀態”是什么意思?这和动态生成有什麽关系?!我把后面的动态生成看过了还没能明白这里的意思!那位朋友能指点一下?先谢了!
CObject* obj = new "aaa"
所以行不通
MFC的那一堆DECLARE_SERIAL等宏 完成了字符串和相应的createObject函数的对应关系,配合Serialize
读到类名字符串后,就去查表,查到了就使用相应的CreateObject创建对象
第二个问题:其实与前一个一样,其实必须事在先构造了一个对象之后,才能用serialize进行恢复。
#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通过两个宏把这些封装起来了