DECLARE_DYNCREATE提供与DECLARE_DYNAMIC完全相同的功能及其动态对象创建功能。那么为什么有人会使用DECLARE_DYNAMIC而不是DECLARE_DYNCREATE?
答案 0 :(得分:10)
记录宏以提供不同的功能。
在从 CObject 派生类时,添加了访问有关对象类的运行时信息的功能。
这提供了内省功能,类似于C ++提供的RTTI(Run-Time Type Information)。应用程序可以通过关联的CRuntimeClass
Structure查询CObject
派生类实例的运行时类型。在需要检查对象是特定类型还是具有特定基类类型的情况下,它非常有用。 CObject::IsKindOf
上的示例应该为您提供一个好主意。
允许在运行时动态创建 CObject 派生类的对象。
此宏允许在运行时动态创建类实例。该功能通过类工厂方法CRuntimeClass::CreateObject
提供。当您需要在运行时根据类类型的字符串表示创建类实例时,可以使用它。一个例子是可自定义的GUI,它是从初始化文件构建的。
这两个功能都是通过相同的CRuntimeClass
Structure实现的,这可能会导致它们可以互换使用。事实上,使用不适当的宏的代码将编译得很好,并暴露所需的运行时行为。差异纯粹是语义上的:宏传达不同的意图,应根据所需的特征使用,以传达开发者的意图。
还有第三个相关的宏,DECLARE_SERIAL
:
生成可以序列化的 CObject 派生类所需的C ++标头代码。
它启用了各个CObject
派生类实例的序列化,例如,文件,内存流或网络套接字。由于反序列化过程需要从序列化流动态创建对象,因此它包含DECLARE_DYNCREATE
的功能。
综合起来,以下列表可以帮助您为特定场景选择正确的宏:
DECLARE_DYNAMIC
。DECLARE_DYNCREATE
。DECLARE_SERIAL
。答案 1 :(得分:0)
当我拥有一个平头时,你会问"为什么要买菲利普斯螺丝刀?"答案是你应该使用适合你需要的工具:如果你只需要驱动平头螺丝,就不要买菲利普斯司机。否则,买一个。
如果您需要DECLARE_DYNCREATE
提供的功能(例如,因为您正在创建一个在打开文档时由框架自动创建的视图),那么您应该使用{{1如果你不和DECLARE_DYNCREATE
一起工作,你应该使用它。