为什么我应该使用DECLARE_DYNAMIC而不是DECLARE_DYNCREATE?

时间:2015-01-10 18:27:30

标签: c++ mfc

DECLARE_DYNCREATE提供与DECLARE_DYNAMIC完全相同的功能及其动态对象创建功能。那么为什么有人会使用DECLARE_DYNAMIC而不是DECLARE_DYNCREATE?

2 个答案:

答案 0 :(得分:10)

记录宏以提供不同的功能。

DECLARE_DYNAMIC

  

在从 CObject 派生类时,添加了访问有关对象类的运行时信息的功能。

这提供了内省功能,类似于C ++提供的RTTI(Run-Time Type Information)。应用程序可以通过关联的CRuntimeClass Structure查询CObject派生类实例的运行时类型。在需要检查对象是特定类型还是具有特定基类类型的情况下,它非常有用。 CObject::IsKindOf上的示例应该为您提供一个好主意。

DECLARE_DYNCREATE

  

允许在运行时动态创建 CObject 派生类的对象。

此宏允许在运行时动态创建类实例。该功能通过类工厂方法CRuntimeClass::CreateObject提供。当您需要在运行时根据类类型的字符串表示创建类实例时,可以使用它。一个例子是可自定义的GUI,它是从初始化文件构建的。

这两个功能都是通过相同的CRuntimeClass Structure实现的,这可能会导致它们可以互换使用。事实上,使用不适当的宏的代码将编译得很好,并暴露所需的运行时行为。差异纯粹是语义上的:宏传达不同的意图,应根据所需的特征使用,以传达开发者的意图。

还有第三个相关的宏,DECLARE_SERIAL

  

生成可以序列化的 CObject 派生类所需的C ++标头代码。

它启用了各个CObject派生类实例的序列化,例如,文件,内存流或网络套接字。由于反序列化过程需要从序列化流动态创建对象,因此它包含DECLARE_DYNCREATE的功能。

综合起来,以下列表可以帮助您为特定场景选择正确的宏:

  1. 如果您的代码需要检索对象的运行时类型,请使用DECLARE_DYNAMIC
  2. 如果您需要根据类型的字符串表示形式动态创建类实例,请使用DECLARE_DYNCREATE
  3. 如果您需要提供序列化支持,请使用DECLARE_SERIAL

答案 1 :(得分:0)

当我拥有一个平头时,你会问"为什么要买菲利普斯螺丝刀?"答案是你应该使用适合你需要的工具:如果你只需要驱动平头螺丝,就不要买菲利普斯司机。否则,买一个。

如果您需要DECLARE_DYNCREATE提供的功能(例如,因为您正在创建一个在打开文档时由框架自动创建的视图),那么您应该使用{{1如果你不和DECLARE_DYNCREATE一起工作,你应该使用它。