DECLARE_DYNCREATE的作用

一、MSDN的解释

启用 CObject对象 --将动态创建的派生类在运行时。

DECLARE_DYNCREATE(class_name )

 目的:使每个CObject的对象在运行的时候具备动态创建的能力,Application Farmework框架利用这种能力来创建对象。 例如,创建的新视图,当您打开新文档。 文档,查看,并且,框架类应支持动态创建,因为框架需要动态创建它们。

  • h ,模块中加入DECLARE_DYNCREATE宏,然后在每个需要访问这个类的对象的 .cpp 文件中包含这个模块。
  • 在类声明中加入 DECLARE_DYNCREATE ,则类实现必须包含 IMPLEMENT_DYNCREATE 。


二、实例

通过上面的解释:大致理解是使用这个DECLARE_DYNCREATE(class_name)可以使每个CObject的对象在运行的时候具备动态创建的能力。框架利用这种能力来创建对象,例如当它从磁盘读取一系列对象的时候,很多对象都需要动态的去创建。

DECLARE_DYNAMIC在afx.h中声明如下:

#define DECLARE_DYNAMIC(classname) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
 
//##class_name 在预处理阶段会被自动翻译为后面class_name
static const AFX_DATA CRuntimeClass class##class_name; \
 
virtual CRuntimeClass* GetRuntimeClass() const; \

 IMPLEMENT_DYNAMIC在afx.h中定义如下:

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
 
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \
CRuntimeClass* PASCAL class_name::_GetBaseClass() \
{ return RUNTIME_CLASS(base_class_name); } \
 
AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \
#class_name, sizeof(class class_name), wSchema, pfnNew, \
&class_name::_GetBaseClass, NULL }; \
 
//重写GetRuntimeClass虚函数,这个函数最初的定义在CObject中,重写后,将返回子类自己的GetRuntimeClass变量
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return RUNTIME_CLASS(class_name); } \

参考:

https://blog.csdn.net/sinat_31608641/article/details/104812915

https://blog.csdn.net/panker2008/article/details/45669121

猜你喜欢

转载自blog.csdn.net/sinat_31608641/article/details/107283627