为什么我应该使用 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
有效,你应该使用它。
记录宏以提供不同的功能。
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
应该会给你一个好主意。
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
.
的功能
综上所述,以下列表应该可以帮助您为您的特定场景选择正确的宏:
- 如果您的代码需要检索对象的 运行 时间类型,请使用
DECLARE_DYNAMIC
。
- 如果您还需要根据类型的字符串表示动态创建 class 实例,请使用
DECLARE_DYNCREATE
。
- 如果您还需要提供序列化支持,请使用
DECLARE_SERIAL
。
DECLARE_DYNCREATE 提供与 DECLARE_DYNAMIC 完全相同的功能及其动态对象创建能力。那么为什么有人应该使用 DECLARE_DYNAMIC 而不是 DECLARE_DYNCREATE?
你问的是 "why buy a Phillips screwdriver when I own a flathead?" 答案是你应该使用适合你需要的工具:如果你只需要驱动一字螺丝,不要购买十字螺丝刀。否则,买一个。
如果您需要 DECLARE_DYNCREATE
提供的功能(例如,因为您正在创建一个在文档打开时由框架自动创建的视图),那么您应该使用 DECLARE_DYNCREATE
,如果你没有,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
应该会给你一个好主意。
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
.
综上所述,以下列表应该可以帮助您为您的特定场景选择正确的宏:
- 如果您的代码需要检索对象的 运行 时间类型,请使用
DECLARE_DYNAMIC
。 - 如果您还需要根据类型的字符串表示动态创建 class 实例,请使用
DECLARE_DYNCREATE
。 - 如果您还需要提供序列化支持,请使用
DECLARE_SERIAL
。