《深入浅出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; // 这一行 行不通多谢!!多谢!!
你把你的数据储存到文件,这些数据很可能(通常是)对象中的成员变量﹔我把它读出来后,势必要依据文件上的记载,重新 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; // 这一行 行不通多谢!!多谢!!
有空到文斌的程序员小站坐坐吧,http://wenbin.anyp.cn
编译时 是不知道classname的
所以 它无法编译通过
new 不支持运行时设置该参数
一个类有一份自己函数的代码编译为二进制机器指令
如有 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是用宏来实现的 让编译器帮你写代码
#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;
}
"char" *pc = new "char";