必威体育Betway必威体育官网
当前位置:首页 > IT技术

DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏

时间:2019-07-09 20:40:00来源:IT技术作者:seo实验室小编阅读:62次「手机版」
 

declare_dynamic

   implement_dynamic是实现“运行时类型识别”宏,与之相对应的是declare_dynamic(声明“运行时类型识别”宏)。也就是说你在.CPP文件中如果看见有IMPLEMENT_DYNAMIC,则在.H文件中必定有DECLARE_DYNAMIC的声明。

DECLARE_DYNAMIC/DEClARE_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏。

declare_dyncreate/implement_dyncreate是为了“动态创建"类的实例而定义的宏。new可以用来创建对象,但不是动态的。比如说,你要在程序中实现根据拥护输入的类名来创建类的实例,下面的做法是通不过的:

char szClassName[60];

cin >> szClassName;

CObject* pOb=new szClassName; //通不过

这里就要用到DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE定义的功能了。

定义:

//////////////////////////////////////////////////////////////////////////////

// Helper macros for declaring CruntimeClass compatible classes

#ifdef _AFXDLL

#define DECLARE_DYNAMIC(class_name) /

protected: /

   static CRuntimeClass* pascal _GetBaseClass(); /

public: /

   static const CRuntimeClass class##class_name; /

   static CRuntimeClass* PASCAL GetThisClass(); /

   virtual CRuntimeClass* GetRuntimeClass() const; /

#define _DECLARE_DYNAMIC(class_name) /

protected: /

   static CRuntimeClass* PASCAL _GetBaseClass(); /

public: /

   static CRuntimeClass class##class_name; /

   static CRuntimeClass* PASCAL GetThisClass(); /

   virtual CRuntimeClass* GetRuntimeClass() const; /

#else

#define DECLARE_DYNAMIC(class_name) /

public: /

   static const CRuntimeClass class##class_name; /

   virtual CRuntimeClass* GetRuntimeClass() const; /

#define _DECLARE_DYNAMIC(class_name) /

public: /

   static CRuntimeClass class##class_name; /

   virtual CRuntimeClass* GetRuntimeClass() const; /

#endif

引用:

DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC

#define DECLARE_DYNAMIC(class_name)/   

public:/

   static CRuntimeClass class##class_name;/

   //声明一个类型为CRuntimeClass的静态public成员变量,变量名是由字符串"class"

   //与所指定的类的类名组成。举例而言,如果你写DECLARE_DYNAMIC(CMyView),则等于声明了一个

   // static CRuntimeClass classCMyView静态变量

   virtual CRuntimeClass* GetRuntimeClass() const;/

   //声明一个虚函数,函数名为GetRuntimeClass,返回值为CRuntimeClass类型的指针

   //无参数,并且是个const函数

#define IMPLEMENT_DYNAMIC(class_name,bass_class_name)/

  _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)

#define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)/

   static char _lpsz##class_name[]= #class_name;/

   //定义一个C类型字符串静态变量,变量名由"_lpsz"和指定类的类名组成,变量值为该指定类型的名字

   //比如是CMyView,那么定义的就是static char _lpszCMyView="CMyView";

   CRuntimeClass class_name::class##class_name = {/

   _lpsz##class_name,sizeof(class_name),wSchema,pfnNew,/

   RUNTIME_CLASS(base_class_name),NULL};/

   //给之前在DECLARE_DYNAMIC里定义的CRuntimeClass类型的静态成员变量赋值

   //当然,除最后一个m_pNextClass没有赋值(赋值为NULL,它由下面的结构处理)

   static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);/

   //初始化一个名为"_init_##class_name"的AFX_CLASSINIT静态结构,主要作用是给指定的class_name的

   //class##class_name静态变量的最后一个成员m_pNextClass赋值,具体见下面解释AFX_CLASSINIT中

   CRuntimeClass* class_name::GetRuntimeClass() const/

   { return &class_name::class##class_name;}/

   //之前在DECLARE_DYNAMIC里定义的GetRuntimeClass的实现,很简单,就一个return语句。

#define RUNTIME_CLASS(class_name)/

   (&class_name::class##class_name)

//这部分之所以单独define出一个宏,主要是为了方便从某个指定的class直接得到它的CRuntimeclass静态成员

//以下是解释AFX_CLASSINIT结构,注意,这不是一个宏

//为了看得更加清楚,我按照struct定义的惯常格式来写这个struct的定义

struct AFX_CLASSINIT {

   AFX_CLASSINIT(CRuntimeClass *pNewClass);

};

AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass)

{

   pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;

   //让m_pNextClass指向pFirstClass所指的CRuntimeClass变量

   CRuntimeClass::pFirstClass = pNewClass;

   //让pFirstClass指向pNewClass所指的变量,也就是本class的CRuntimeClass静态变量

}

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读