《深入浅出MFC》中是这样讲解为什么不能用 new 进行动态生成的:
   
   你把你的数据储存到文件,这些数据很可能(通常是)对象中的成员变量﹔我把它读出来后,势必要依据文件上的记载,重新 new 出那些个对象来。问题在于,即使我的程序有那些类别定义(就算我的程序和你的程序有㆒样的内容好了),我能够这么做吗:
char className[30] = getClassName(); // 从文件或使用者输入 获得一个类名称
CObject* obj = new classname; // 这一行 行不通
首先,new classname 这个动作就过不了关。其次,就算过得了关,new 出来的对象究竟该是什么类别型态?虽然以一个指向MFC 类别老祖宗(CObject)的对象指针来容纳它绝对没有问题,但终不好总是如此吧! 我的问题是:为什么 new classname 这个动作就过不了关?不是已经知道类名了吗?为了动态生成MFC定义了两个宏:DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE #define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \
CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \
class_name::CreateObject)其中 DECLARE_DYNCREATE(class_name)\
static CObject*PASCAL CreateObject();\这句是CreateObject 声明
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在 #define IMPLEMENT_DYNCREATE(class_name,base_class_name)\
CObject*PASCAL class_name::CreateObject()\
{return new class_name;}\  这句是CreateObject 的定义我的问题:
   CObject*PASCAL class_name::CreateObject() {return new class_name;}
这一句中的 return new class_name 依旧还是根据类名 new 出的对象,与下面这句有什么不同???
  CObject* obj = new classname; // 这一行 行不通多谢!!多谢!!

解决方案 »

  1.   

    char className[30]是一个字符串,而new后面要接的是一个类型名,在语法上就编译不过去的。至于后一问中的new class_name就是可以的了。
    有空到文斌的程序员小站坐坐吧,http://wenbin.anyp.cn
      

  2.   

    new classname  classname 是在运行时才知道的
    编译时 是不知道classname的
    所以 它无法编译通过
    new 不支持运行时设置该参数
      

  3.   

    在 #define IMPLEMENT_DYNCREATE(class_name,base_class_name)CObject*PASCAL class_name::CreateObject(){return new class_name;}\  这句是CreateObject 的定义时可以在编译时确定的
    一个类有一份自己函数的代码编译为二进制机器指令
    如有 IMPLEMENT_DYNCREATE(A, baseA)
    就是 return new A; 它是在编译时确定的
    再有 IMPLEMENT_DYNCREATE(B, baseB)
    就有另外一个确定的函数 return new B;
    注意 不是
    f(param)

       return new(Patam)
    }
    现在的模板可以实现这一功能
    template<class T>
    T* new()
    {
        return new T;
    }
    以前的MFC是用宏来实现的 让编译器帮你写代码
      

  4.   

    TO:楼主#include <iostream.h>
    #define PASCAL _stdcall
    class CObject;
    #define IMPLEMENT_DYNCREATE(class_name,base_class_name)new class_name;
    class CObject
    {
    public:
    void f()
    {
    cout << "I am here!" << endl;
    }
    };
    class CCmdTarget: public CObject

    public:
    static CObject* CreateObject();

    };
    int main()
    {
    CObject* pCObject = IMPLEMENT_DYNCREATE( CCmdTarget, CObject )
    pCObject ->f(); return 0;
    }
      

  5.   

    你能这样来声明变量吗?
    "char" *pc = new "char";