IMPLEMENT_DYNCREATE宏定义

转载 2015年11月19日 15:57:54

使用DECLARE——DYNCREATE宏时,使能Cobject派生类的对象在运行时动态被创建。

IMPLEMENT_DYNCREATE(class_name, base_class_name )

Parameters

class_name

派生类名.

base_class_name

基类名.

Remarks

框架使用这种技巧动态的创建新的对象。如,序列化时,从盘中读一个对象。在类实现的文件中添加宏IMPLEMENT_DYNCREATE. For more information, see CObject Class Topics.

如果你使用了DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏, 你可以使用RUNTIME_CLASS 宏和 CObject::IsKindOf 成员函数去决定是否在运行时中创建宏.

如果类声明的文件中包含有DECLARE_DYNCREATE, 类实现的文件中必须有 IMPLEMENT_DYNCREATE.

Example

/* CAge.h */

class CAge : public CObject

{

     int num;

public:

     DECLARE_DYNCREATE(CAge)

};

//==============

/* CAge.cpp */

#include "stdafx.h"

#include "CAge.h"

IMPLEMENT_DYNCREATE(CAge, CObject)

CObject 成员函数 IsKindOf 可用于确定具体某个对象是属于特定类还是从特定类派生。IsKindOf 的参数是 CRuntimeClass 对象,使用带类名的 RUNTIME_CLASS 宏可获取该参数。

  • 对于类 CObject,如下所示使用带类名的 RUNTIME_CLASS
    IMPLEMENT_DYNCREATE  - duling - 不息,不息,不息 复制代码
    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );

很少需要直接访问运行时类对象。更常用的方法是将运行时类对象传递到 IsKindOf 函数,如下一过程所示。IsKindOf 函数测试对象,确定对象是否属于特定类。

  1. 确保类具有运行时类支持。即类必须是直接或间接从 CObject 派生,且使用从 CObject 派生类章节中解释的 DECLARE_DYNAMIC 和 IMPLEMENT_DYNAMICDECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 或 DECLARE_SERIAL 和 IMPLEMENT_SERIAL 宏。
  2. 如下所示,为该类的对象调用 IsKindOf 成员函数,并使用 RUNTIME_CLASS 宏生成 CRuntimeClass 参数:
    // in .H file  class CPerson : public CObject  {      DECLARE_DYNAMIC( CPerson )  public:      CPerson(){};        // other declaration   };   
     // in .CPP file IMPLEMENT_DYNAMIC( CPerson, CObject ) void SomeFunction(void) { CObject* pMyObject = new CPerson; if(pMyObject->IsKindOf( RUNTIME_CLASS( CPerson ) ) ) { //if IsKindOf is true, then cast is all right CPerson* pmyPerson = (CPerson*) pMyObject ; ... delete pmyPerson; } ... delete [MyObject]; }
  3. IsKindOf 返回 TRUEIsKindOf 不支持多重继承或虚基类,但如有必要,可对派生的 Microsoft 基础类使用多重继承。

IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)

IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)//声明CMainFrame类是从CFrameWnd类派生 //动态声明宏,可以不管它,向导生成 BEGIN_ME...
  • xbeinonlinkejidaxue
  • xbeinonlinkejidaxue
  • 2014年10月26日 16:42
  • 791

DECLARE_DYNCREATE(DECLARE_DYNAMIC)与IMPLEMENT_DYNCREATE(IMPLEMENT_DYNAMIC)解析

随便搜索一下,发现给出的解释是在运行期让派生类支持动态创建,可是给出详细解释的却很少,那么下面仔细看看此宏的扩展: #define DECLARE_DYNCREATE(class_name) \ ...
  • waxgourd0
  • waxgourd0
  • 2012年12月03日 11:39
  • 3997

DECLARE_DYNAMIC() IMPLEMENT_DYNAMIC(, )作用

class CAge : public CObject {  DECLARE_DYNCREATE(CAge); }; class CAge2 : public CObject {  DECLARE_D...
  • iamherego
  • iamherego
  • 2017年01月09日 13:14
  • 450

MFC深入浅出之动态创建---亦是宏的定义

有了MFC深入浅出之RTTI技术---宏的定义这篇文章以后下面这个动态创建可以说就简单的多了.   再来看看动态创建技术: #define DECLARE_DYNCREATE(class_nam...
  • yuanweihuayan
  • yuanweihuayan
  • 2011年10月16日 12:31
  • 929

Visual C++ MFC 中常用宏的含义 DECLARE_DYNCREATE 和 ?

比如说,Class *pClass = new Class需要动态创建的时候使用 比如 class CPerson : public CObject { DECLARE_DYNAMIC( CPerso...
  • zmq5411
  • zmq5411
  • 2011年02月15日 10:30
  • 1058

IMPLEMENT_DYNCREATE

IMPLEMENT_DYNCREATE   IMPLEMENT_DYNCREATE(class_name,base_class_name)   说明:   通过DECLARE_DYNCREATE宏来使...
  • WINCOL
  • WINCOL
  • 2010年09月02日 15:01
  • 3450

【vc】DECLARE_SERIAL / IMPLEMENT_SERIAL 宏的技术详解

DECLARE_DYNAMIC表明的是支持类型信息, 有了这个宏,我们就可以判断一个类究竟是什么类,比如class A;class B:public A;A a;B b;现在有一个指针 class *...
  • jianxiong8814
  • jianxiong8814
  • 2007年05月31日 13:55
  • 4435

IMPLEMENT_SERIAL

IMPLEMENT_SERIAL 编辑 IMPLEMENT_SERIAL IMPLEMENT_SERIAL( class_name, base_class_name, wSc...
  • songjunyan
  • songjunyan
  • 2014年05月21日 21:01
  • 1364

windows程序设计(21):剖析单文档架构

之前我们剖析了一个最简单的MFC程序,有了这个基础,我们就可以剖析一个MFC的单文档应用程序了。 大概浏览了一下,我们发现3处不一样(而不是增加)的地方: 1.InitInstance ...
  • thefutureisour
  • thefutureisour
  • 2012年11月25日 20:26
  • 1330

IMPLEMENT_DYNCREATE宏定义

使用DECLARE——DYNCREATE宏时,使能Cobject派生类的对象在运行时动态被创建。 IMPLEMENT_DYNCREATE(class_name, base_class_nam...
  • chy19911123
  • chy19911123
  • 2015年11月19日 15:57
  • 1254
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IMPLEMENT_DYNCREATE宏定义
举报原因:
原因补充:

(最多只允许输入30个字)