随便搜索一下,发现给出的解释是在运行期让派生类支持动态创建,可是给出详细解释的却很少,那么下面仔细看看此宏的扩展:
#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();
#define _DECLARE_DYNCREATE(class_name) \
_DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();
从上面看到 DECLARE_DYNCREATE 内部使用了 DECLARE_DYNAMIC 宏,那么设想一下是否 IMPLEMENT_DYNCREATE 内部也应该使用 IMPLEMENT_DYNAMIC宏,我们来看看是不是这样:
#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, NULL)
发现并没有IMPLEMENT_DYNAMIC 宏,别着急,让我们先来看看IMPLEMENT_DYNAMIC 宏:
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)
这样看来他们在内部是相同的,内部是使用 DECLARE_DYNAMIC 、IMPLEMENT_DYNAMIC,下面借来仔细观察这两个宏的内部拓展。implement_dyncreate
IMPLEMENT_DYNAMIC 是实现“运行时类型识别”宏,与之相对应的是 DECLARE_DYNAMIC 声明“运行时类型识别”宏)。也就是说你在.CPP文件中如果看见有IMPLEMENT_DYNAMIC,则在.h文件中必定有DECLARE_DYNAMIC的声明。
DECLARE_DYNAMIC/DECLARE_DYNAMIC 是为了确定运行时对象属于哪一个类而定义的宏。
DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE 是为了“动态创建"类的实例而定义的宏。new可以用来创建对象,但不能在还不知道要创建那个类的对象时进行动态的创建。可以参考一个很普遍的例子:
要在程序中实现根据拥护输入的类名来创建类的实例,下面的做法是通不过的
char szClassName[60];
cin >> szClassName;
CObject* pOb=new szClassName; //通不过
这里就要用到 DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE 定义的功能了。implement_dyncreate
查看afx.h头文件里的宏定义:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-25930-1.html
入我领海
老巴可比你富哦
你来鉴定吧