gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:48:18 27 4
gpt4 key购买 nike

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

最佳答案

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

DECLARE_DYNAMIC :

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

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

DECLARE_DYNCREATE :

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

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

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

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

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

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

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

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

关于c++ - 为什么我应该使用 DECLARE_DYNAMIC 而不是 DECLARE_DYNCREATE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27879680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com