在学习<深入浅出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之中呢?
学识浅薄,很多地方都不太明白,所以请各位不要见笑,另请给一解惑.

解决方案 »

  1.   

    申明static类使得整个程序只获得一个(且只有一个)对象..............
      

  2.   

    #define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \
    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); } \
      

  3.   

    每个类都有一个 static CRuntimeClass class##class_name; 不是每个对象都有
    CRuntimeClass 有一个 static CRuntimeClass* pFirstClass;作为链表的头指针
      

  4.   

    我又想了很长时间,我觉得是不是这个原因,在每一个类别中进行static CRuntimeClass 的宣告,是为了解决每一个类的只有一个CRuntimeClass的问题,要知道是有继承的.不可能为类等级中的每一个父类都去建一个CRuntimeClass的结构.而在CRuntimeClass的内部,所有的变量和静态变量遵从类内部的成员的访问规则.对于pFirstClass来说它是个静态变量,独立存储于类中其它非静态成员的空间之中,同一个static对于类或结构和对于变量来说产生了不同的效果.这是不是很让编绎器伤脑筋.还是我还有什么没想到呢.请高人指点.
      

  5.   

    为了建立那张类别网,
    CRuntimeClass就是网中的节点数据类型,每个类中有一个CRuntimeClass结构
    CRuntimeClass结构包括m_pBaseClass, m_pNextClass, 和静态的pFirstClass等数据
    m_pBaseClass指向父类,m_pNextClass指向链中的下一个类,网就联系起来了
    pFirstClass作为这张网的访问起点,无论多少个类只有一个,因此用静态的
      

  6.   

    今天我又思考了一下.我发现了一个问题.原来static CRuntimeClass class##class_name;进行这样的一个宣告,是为了把指向 CRuntimeClass 结构的指针说明成为静态.所以结构中其它的成员自然是遵从静态和类中成员的访问规则的.这也就不难理解pFirstClass是一个静态全局变量了.可是这种把指向一个结构的指针说明成静态,然后返回再对其中的成员进行修改的做法在C++Primer中是受到指责的.但这个用法却是符合virtual CRuntimeClass* GetRuntimeClass() const;这个函数的要求的.不知道这次理解的对否.请大家指点.