DECLARE_DYNCREATE提供了完全相同的DECLARE_DYNAMIC特性以及它的动态对象创建能力。那么,为什么有人要使用DECLARE_DYNAMIC而不是DECLARE_DYNCREATE呢?
发布于 2015-01-11 11:59:23
这些宏被记录下来以提供不同的功能。
DECLARE_DYNAMIC
添加从CObject派生类时访问有关对象类的运行时信息的功能。
这提供了内省功能,类似于C++提供的RTTI (RTTI)。应用程序可以通过关联的CObject-derived类实例查询其运行时类型。在需要检查对象是否属于特定类型或具有特定基类类型的情况下,它非常有用。CObject::IsKindOf的示例应该给您一个好主意。
DECLARE_DYNCREATE
允许在运行时动态创建CObject-derived类的对象。
此宏允许在运行时动态创建类实例.该功能是通过类工厂方法CRuntimeClass::CreateObject提供的。当您需要根据类类型的字符串表示在运行时创建类实例时,可以使用它。一个例子是一个可自定义的GUI,它是由一个初始化文件构建的。
这两个特性都是通过相同的结构实现的,这可能导致可以互换使用它们的结论。实际上,使用不适当宏的代码会编译得很好,并公开所需的运行时行为。区别纯粹是语义的:宏传递不同的意图,并应根据所需的特性使用,以传达开发人员的意图。
还有第三个相关的宏,DECLARE_SERIAL
生成可以序列化的CObject-derived类所需的C++头代码。
它允许将各自的CObject-derived类实例序列化,例如将其序列化到文件、内存流或网络套接字。由于反序列化过程需要从序列化流动态创建对象,因此它包含了DECLARE_DYNCREATE的功能。
综合起来,下面的列表将帮助您为特定的场景选择正确的宏:
DECLARE_DYNAMIC。DECLARE_DYNCREATE。DECLARE_SERIAL。发布于 2015-01-11 11:38:02
你是在问:“为什么我拥有一台飞利浦螺丝刀?”答案是,你应该使用适合你需要的工具:如果你只需要开爆头螺丝,不要买菲利普斯的司机。否则,买一个。
如果您需要DECLARE_DYNCREATE提供的特性(例如,因为您正在创建一个在打开文档时由框架自动创建的视图),那么您应该使用DECLARE_DYNCREATE,如果您不使用并且DECLARE_DYNAMIC工作,您应该使用它。
https://stackoverflow.com/questions/27879680
复制相似问题