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

Why should I use DECLARE_DYNAMIC instead of DECLARE_DYNCREATE?

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

你问的是 "why buy a Phillips screwdriver when I own a flathead?" 答案是你应该使用适合你需要的工具:如果你只需要驱动一字螺丝,不要购买十字螺丝刀。否则,买一个。

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

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

DECLARE_DYNAMIC:

Adds the ability to access run-time information about an object's class when deriving a class from CObject.

这提供了内省的功能,类似于 RTTI(Run-Time Type Information) provided by C++. An application can query a CObject-derived class instance for its run-time type through the associated CRuntimeClass Structure. It is useful in situations where you need to check that an object is of a particular type, or has a specific base class type. The examples at CObject::IsKindOf 应该会给你一个好主意。

DECLARE_DYNCREATE:

Enables objects of CObject-derived classes to be created dynamically at run time.

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

这两个功能是通过相同的 CRuntimeClass Structure 实现的,这可能会得出它们可以互换使用的结论。事实上,使用不适当宏的代码将编译得很好,并公开所需的 运行 时间行为。区别纯粹是语义上的:宏传达不同的意图,应根据所需的功能使用,以传达开发人员的意图。

还有第三个相关的宏,DECLARE_SERIAL:

Generates the C++ header code necessary for a CObject-derived class that can be serialized.

它启用相应 CObject 派生的 class 实例的序列化,例如到文件、内存流或网络套接字。由于反序列化过程需要从序列化流中动态创建对象,因此它包含 DECLARE_DYNCREATE.

的功能

综上所述,以下列表应该可以帮助您为您的特定场景选择正确的宏:

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