MFC中CRuntimeClass类有什么作用? 我在看VC时,经常遇到CRuntimeClass类,这个类究竟有什么作用? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CRuntimeClass结构 要理解CObject,我们先来看一下CRuntimeClass这个在MFC中至关重要的一个结构。每个从CObject中派生的类都有有一个CRuntimeClass对象同它关联以完成在运行时得到类实例的信息或者是它的基类。 在afx.h中它的定义如下: struct CRuntimeClass{// AttributesLPCSTR m_lpszClassName; //类名,一般是指包含CRuntimeClass对象的类的名称int m_nObjectSize; //包含CRuntimeClass对象的类sizeof的大小,不包括它分配的内存UINT m_wSchema; // schema number of the loaded classCObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class 指向一个建立实例的构造函数#ifdef _AFXDLLCRuntimeClass* (PASCAL* m_pfnGetBaseClass)();#elseCRuntimeClass* m_pBaseClass;#endif//以上m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表// OperationsCObject* CreateObject(); //这个函数给予CObject 派生类运行时动态建立的能力BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;//这个函数使用 m_pBaseClass或 m_pfnGetBaseClass遍历整个类层次确定是否pBaseClass指向的类是基类,//使用它可以判断某类是否是从pBaseClass指向的类在派生来。// Implementationvoid Store(CArchive& ar) const;static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);// CRuntimeClass objects linked together in simple listCRuntimeClass* m_pNextClass; // linked list of registered classes 很有用,比如说如果你知道一个类名,可以直接通过该类名(字符串)创建一个对象,想要详细了解这方面的情况,去看下《深入浅出MFC》第三章。MFC的设计很巧妙,通过几个简单的宏,就构建出了一张大网,实现了很多功能。这些东西,那本书上说得都很清楚。 乱码问题? 接受客户端消息是马上处理完回发呢还是应该先囤积消息再开一个线程慢慢处理回发? 某类访问另一个类实例类对象? 想认识一些做图象处理的朋友交流 能在类的实现里,自己NEW自己吗? 求助:请问怎么把一个程序转成后台运行,不要在屏幕上显示? 如何第一时间得到菜单的响应消息(在线等,分数不够可以加) 单文档工程 如何获得View类的指针? 怎样导入对话框资源? 求助 : directshow播放直播流,如何获得缓存的数据 点构成图形的放大问题 debug和Release 的问题
要理解CObject,我们先来看一下CRuntimeClass这个在MFC中至关重要的一个结构。
每个从CObject中派生的类都有有一个CRuntimeClass对象同它关联以完成在运行时得到类实例的信息或者是它的基类。 在afx.h中它的定义如下:
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName; //类名,一般是指包含CRuntimeClass对象的类的名称
int m_nObjectSize; //包含CRuntimeClass对象的类sizeof的大小,不包括它分配的内存
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class 指向一个建立实例的构造函数
#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
CRuntimeClass* m_pBaseClass;
#endif
//以上m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表
// Operations
CObject* CreateObject(); //这个函数给予CObject 派生类运行时动态建立的能力
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
//这个函数使用 m_pBaseClass或 m_pfnGetBaseClass遍历整个类层次确定是否pBaseClass指向的类是基类,
//使用它可以判断某类是否是从pBaseClass指向的类在派生来。
// Implementation
void Store(CArchive& ar) const;
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);
// CRuntimeClass objects linked together in simple list
CRuntimeClass* m_pNextClass; // linked list of registered classes
MFC的设计很巧妙,通过几个简单的宏,就构建出了一张大网,实现了很多功能。这些东西,那本书上说得都很清楚。