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

3 c++ mfc

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

IIn*_*ble 11

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

DECLARE_DYNAMIC:

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

这提供了内省功能,类似于C++提供的RTTI(运行时类型信息).应用程序可以CObject通过关联的CRuntimeClass结构查询已派生的类实例的运行时类型.在需要检查对象是特定类型还是具有特定基类类型的情况下,它非常有用.这些例子CObject::IsKindOf应该给你一个好主意.

DECLARE_DYNCREATE:

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

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

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

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

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

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

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

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

  • 另请注意,如果您在头文件中使用“DECLARE_DYNCREATE”,则必须确保将其与源文件中的“IMPLMENT_DYNCREATE”相匹配。(其他人也是如此。) (2认同)