在学习<深入浅出MFC>中看到CRunTimeClass中对于static的运用大惑不解
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
CRuntimeClass* m_pBaseClass;
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
在DECLARE_DYNAMIC中有
#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;
让我不明白的就是在declare_dynamic中的这个static,在书中我看到在CRuntimeClass中因为有static CRuntimeClass* pFirstClass; 的声明而使pFirstClass成为一个独立于类别中其它变量独立存在的全局指针,使得类别网建立起来后实现资料的链接.那么static CRuntimeClass class##class_name;将一个CRuntimeClass都声明为static,那么它使CRuntimeClass结构中其它那些变量又遵从什么样的特性呢?是否是双重的static使pFirstClass成为了一个全局的静态指针,而在结构CRuntimeClass前static使那些在结构定义中的变量成为局部的静态变量呢?而这些被定义为局部静态变量的名空间也就只是在相应的class之中呢?
学识浅薄,很多地方都不太明白,所以请各位不要见笑,另请给一解惑.
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
CRuntimeClass* m_pBaseClass;
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
在DECLARE_DYNAMIC中有
#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;
让我不明白的就是在declare_dynamic中的这个static,在书中我看到在CRuntimeClass中因为有static CRuntimeClass* pFirstClass; 的声明而使pFirstClass成为一个独立于类别中其它变量独立存在的全局指针,使得类别网建立起来后实现资料的链接.那么static CRuntimeClass class##class_name;将一个CRuntimeClass都声明为static,那么它使CRuntimeClass结构中其它那些变量又遵从什么样的特性呢?是否是双重的static使pFirstClass成为了一个全局的静态指针,而在结构CRuntimeClass前static使那些在结构定义中的变量成为局部的静态变量呢?而这些被定义为局部静态变量的名空间也就只是在相应的class之中呢?
学识浅薄,很多地方都不太明白,所以请各位不要见笑,另请给一解惑.
解决方案 »
- VS2005 和 ROSE 的使用。
- 问一个程序整体框架的问题。请大家出出主意
- "warning LNK4089: /OPT:REF 已丢弃所有对“OLEAUT32.dll”的引用"怎么才能让其没有啊?
- 请问如何得到当前电脑LPT端口的信息
- 关于MFC库和API函数的问题,希望得到大家的帮助,本人在线等待。。。。。。
- VC中的错误提示h:\temp\vc\win1\win1.cpp(89) : fatal error C1010: unexpected end of file while looking for precompiled header dire
- 高手请进修生
- CStringArray类中的SetAt函数第二参数我想转进去个CString类型的,怎么办?
- 各位高手,帮帮忙
- MFC问题,如何获得窗口句柄?
- 向大家请教一个问题,如果在英文操作系统下面用VC操作繁体的文件呢?
- 列表框问题
AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \
#class_name, sizeof(class class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return RUNTIME_CLASS(class_name); } \
CRuntimeClass 有一个 static CRuntimeClass* pFirstClass;作为链表的头指针
CRuntimeClass就是网中的节点数据类型,每个类中有一个CRuntimeClass结构
CRuntimeClass结构包括m_pBaseClass, m_pNextClass, 和静态的pFirstClass等数据
m_pBaseClass指向父类,m_pNextClass指向链中的下一个类,网就联系起来了
pFirstClass作为这张网的访问起点,无论多少个类只有一个,因此用静态的