MFC动态创建等几个宏解读

本文介绍了C++中的静态数据成员、常成员函数以及MFC中的宏使用,特别是DECLARE_DYNAMIC、DECLARE_DYNCREATE和IMPLEMENT_SERIAL等,详细解析了这些宏在类继承和动态创建中的作用和原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++语法理解

1.静态数据成员具有静态生存期。

 

2.派生类与基类共享一份静态成员数据。

引用C++ primer的一段话:

"If a base class defines a static member there is only one such member defined for the entire hierarchy. Regardless of the number of classes derived from the base class, there exists a single instance of each static member."

 

3.static声明外部变量。又称静态外部变量。静态外部变量作用域只限于本文件,其它文件不可使用extern扩展其作用域。可以避免其它文件误用。

 

4.常成员函数。使用const关键字修饰的函数为常成员函数。常成员函数不能更改对象数据成员,也不能调用该对象中没有用const修饰的成员函数。

 

5.子类与基类同名静态成员不会发生覆盖。静态成员可以用类名区分。

 

VS使用技巧

1.只有把类的定义文件显示地加入工程,类的定义才会在[class view]中显示。不能只使用#include "header.h"

 

2.工程中使用MFC类时,只要include相关头文件,并在工程设置中,选择使用MFC DLL就可以了。

 

MFC代码(VC6.0

1.尽可能地使用传给宏的class_name,和使用static修饰外部变量(注意是外部变量,不是类中的静态成员), 以避免名字污染。

 

2.AFX_CLASSINIT是一个只有构造函数的类。在其构造函数中把CRuntimeClass指针添加到“类别型录网”中。在IMPLEMENT_宏中定义了一个static AFX_CLASSINIT变量,负责添加工作。

 

3.DECLARE_DYNAMICDECLARE_DYNCREATEDECLARE_SERIAL而服务。有点若没有DECLARE_SERIALDECLARE_DYNAMICDECLARE_DYNCREATE就没有存在的意思。因为三个宏的关系是:后面的宏是对前面宏的补充。而且在实现宏中只有IMPLEMENT_SERIAL定义了AFX_CLASSINIT变量。意味着DECLARE_DYNCREATEDECLARE_DYNAMIC中的CRuntimeClass没有加入“类别型录网”,都是独立的。

定义宏

实现宏:

   

4.DECLARE_DYNCREATE 中将CObject* PASCAL CreateObject();static修饰的原因:

(1)CObject* PASCAL CreateObject();将会赋值给CRuntimeClassm_pfnCreateObject,而后者是一个指向普通函数的指针。只有类成员函数为静态时,才能典型赋值给一个普通函数指针。不把m_pfnCreateObject定义成类成员函数,可以免去麻烦的类别转换。

(2)使用CreateObject不依赖对象而存在,方便动态创建。

 

5.DECLARE_DYNAMIC    virtual CRuntimeClass* GetRuntimeClass() const修饰的原因。

请注意在CObject中有下常成员函数:

BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const

{

     ***

      CRuntimeClass* pClassThis = GetRuntimeClass();

      return pClassThis->IsDerivedFrom(pClass);

}

其中使用了GetRuntimeClass根据c++语法理解4GetRuntimeClass必须为常成员函数。

 

6._DECLARE_DYNAMIC 中的static AFX_DATA CRuntimeClass class##class_name;标识的一张“名片”,因为它是静态的,根据c++语法理解12。该名片有全局变量的作用。意思就是只要定义了这个类,就相当于定义了一个全局变量。且在继承过程中名片只保留了一份。

 

7. #define DECLARE_MESSAGE_MAP() /

private: /

      static const AFX_MSGMAP_ENTRY _messageEntries[]; /

protected: /

      static AFX_DATA const AFX_MSGMAP messageMap; /

      virtual const AFX_MSGMAP* GetMessageMap() const; /

根据c++语法理解5,在基类与子类同时添加同名静态变量,是不会出问题的。

注意vs2005DECLARE_MESSAGE_MAP不再包含这两个静态成员。而在BEGIN_MESSAGE_MAP END_MESSAGE_MAP两个宏共同构造的GetThisMessageMap函数内部使用了这两个构造发

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值