CRuntimeClass

CRuntimeClass在MFC中定义为一个数据结构,在文件AFX.H中声明,它是用来串起MFC从CObject继承下来的所有类(相当于一根绳,只要你牵住绳的一头你就可以得到绳上的所有数据),你也可以把你自己写的类加入这根绳。

 

struct CRuntimeClass
{
// Attributes
  LPCSTR m_lpszClassName;//这个类的名字
  int m_nObjectSize;//类的大小
  UINT m_wSchema; // 计划类的绳中数目大小

  CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class//支持动态创建
#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
  CRuntimeClass* m_pBaseClass;
#endif

// Operations
  CObject* CreateObject();//支持动态创建
  BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;//判断是不是一个基类的子类

// Implementation
  void Store(CArchive& ar) const;
  static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);

  // CRuntimeClass objects linked together in simple list
 CRuntimeClass* m_pNextClass;       //  指向另一个类的CRuntimeClass结构的指针
};

 

也就是说每新建一个类我们都可以加入MFC的继承表中,就是每个类声明中加入一个CRuntimeClass但是这个数据结构中有很多成员变量和函数。而且在实现文件中也要加入一些成员变量和函数的初始化或者成员函数的定义工作,每个类都要这么做会花很多行代码。还好微软给我们定义了几个宏让我们可以很方便的把我们定义的类加入到MFC继承的大绳中去。

 

1、//这个宏在声明文件中出现

DECLEAR_DYNAMIC(classname) /

#define DECLARE_DYNAMIC(class_name) /
public: /
static CRuntimeClass class##class_name; /              在类中建立一个CRuntimeClass的结构
virtual CRuntimeClass* GetRuntimeClass() const;        在类中建立一个虚拟函数

##表示把字符串连接起来

2.//这个宏出现在实现文件中

IMPLEMENT_DYNAMIC /

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) /
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)

而IMPLEMENT_RUNTIMECLASS宏的定义是

#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) /
CRuntimeClass* PASCAL class_name::_GetBaseClass() /
   { return RUNTIME_CLASS(base_class_name); } /
AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { /

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

&class_name::_GetBaseClass, NULL }; /

CRuntimeClass* class_name::GetRuntimeClass() const /
   { return RUNTIME_CLASS(class_name); } /

CRuntimeClass的说明
绳子的最末端处理,就是绳子的初始化:

CRuntimeClass的说明

有了这个大网之后我们就可以判断一个类是不是另一个类的派生类.

为了在得到一个类名后可以创建一个该类对象,我们不以直接NEW出一个来,因为MFC不知道这是一个类,而CRUNTIMECLASS中可以加入一个构造函数,这样就可以支持动态创建一个已知类名的类的对象.

而MFC又提供给我们新的宏定义

在声明文件中需要DECLARE_DYNCREATE宏

#define DECLARE_DYNCREATE(class_name) /
DECLARE_DYNAMIC(class_name) /
static CObject* PASCAL CreateObject();//往类中加入一个函数

在定义文件中需加入另一个宏

#define IMPLEMENT_DYNCREATE(class_name, base_class_name) /
CObject* PASCAL class_name::CreateObject() /
{ return new class_name; } /
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, /

class_name::CreateObject)

 

博客源地址:http://blog.sina.com.cn/s/blog_5b06f46c0100phy1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值