VC中DELCLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏的完整含意和用法
来源:互联网 发布:微信开发 必须学java 编辑:程序博客网 时间:2024/05/21 11:32
MFC为了达到RTTI的功能实现使用了CRunTimeClass类,该类记录必要的信息,以便建立型录,用链表来实现,CRunTimeClass的成员变量类的名称,链表的First指针和Next指针。
MFC为了把CRunTimeClass放进类中,就主要使用了DELCLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏。
#define RUNTIME_CLASS(class_name)(&class_name::class##class_name)其中class##class_name为类中
#define DECLARE_DYNAMIC(class_name) /
public: /
static CRuntimeClass class##class_name; /
virtual CRuntimeClass* GetRuntimeClass() const;
public: /
static CRuntimeClass class##class_name; /
virtual CRuntimeClass* GetRuntimeClass() const;
CRuntimeClass结构体变量,##告诉编译器把class和class_name连接起来。
DECLARE_DYNAMIC作用:声明类中的静态CRuntimeClass变量,使这个类中的所有对象共享。以前学习到静态变量但是不知为何用,现在在这里用到了。
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) ///这就是IMPLEMENT_DYNAMIC完成的功能
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
其中_IMPLEMENT_RUNTIMECLASEE也是一个宏。
#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) / 此为换行符
static char _lpsz##class_name[] = #class_name; /把类名格式化为字符串,这是静态的数据成员,类的所有对象共享
CRuntimeClass class_name::class##class_name = { /
_lpsz##class_name类名,以零结束的字符串,
static char _lpsz##class_name[] = #class_name; /把类名格式化为字符串,这是静态的数据成员,类的所有对象共享
CRuntimeClass class_name::class##class_name = { /
_lpsz##class_name类名,以零结束的字符串,
sizeof(class_name)//大小, wSchem//版本号a, pfnNew, /
RUNTIME_CLASS(base_class_name), NULL }; /
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); /加入链表
CRuntimeClass* class_name::GetRuntimeClass() const /
{ return &class_name::class##class_name; } /
RUNTIME_CLASS(base_class_name), NULL }; /
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); /加入链表
CRuntimeClass* class_name::GetRuntimeClass() const /
{ return &class_name::class##class_name; } /
其中AFX_CLASSINIT是一个结构体,它表示一个构造函数。
struct AFX_CLASSINIT
{ AFX_CLASSINIT(CRuntimeClass* pNewClass); };//声明
{ AFX_CLASSINIT(CRuntimeClass* pNewClass); };//声明
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)//定义
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}
例子:在MFC中经常会用到这两个宏。
//在头文件
class CView : public CWnd
{
DECLARE_DYNAMIC(CView) //在MFC中实际是显示 DECLARE_DYNCREATE
...
};
//在实现文件
IMPLEMENT_DYNAMIC(CView,CWnd) //在MFC中实际是显示 IMPLEMENT_DYNCREATE
将两个宏展开就可以简单建构数据并完成加入链表的工作。
总结于《深入浅出MFC》
- VC中DELCLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏的完整含意和用法
- VC中DELCLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏的完整含意和用法
- DELCLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- epool给我们带来了什么
- 基本ASCII码表
- Windows下使用net-snmp-5.4.1扩展代理所遇问题及解决
- 为什么在用ASP编程时会出现代号为“80040e57"的错误?
- 在Linux中创建静态库和动态库
- VC中DELCLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏的完整含意和用法
- 使用C#在數據庫中存取文件
- 循环滚动的图片
- C语言宏定义技巧(常用宏定义)
- Ajax入门范例.
- U盘病毒卷土重来化身“方块Q”趁机作案
- 让Web站点崩溃最常见的七大原因
- epoll完成的大量代理地址验证程序
- sql将文本导入数据表步骤