`
bcyy
  • 浏览: 1818703 次
文章分类
社区版块
存档分类
最新评论

MFC动态创建等几个宏解读

 
阅读更多

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函数内部使用了这两个构造发

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics