深入浅出MFC中99页写到: IMPLEMENT_DYNAMIC最美妙的地方在于使用了一个struct AFX_CLASSINIT结构,其定义如下:
      struct AFX_CLASSINIT
         { 
               AFX_CLASSINIT(CRuntimeClass * pNewClass)
               {
                       pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
                       CRuntimeClass::pFirstClass=pNewClass;
               }
         }然后查了下MSDN发现没有AFX_CLASSINIT的定义,然后又在VS08里面找IMPLEMENT_DYNAMIC的宏定义,发现并没有使用这个结构。
然后想问一下:如果要用这个结构来做修改CRuntimeClass的操作,干嘛不直接写一个全局函数实现这个功能?还要搞个复杂的struct,然后用构造函数隐式地修改链表结构?

解决方案 »

  1.   

    http://topic.csdn.net/t/20030727/16/2077342.html
      

  2.   

    问题不在于用哪种方式实现,而是这些实现的代码在什么时机执行。不如自己先思考一下,AFX_CLASSINIT的名称翻译为“类初始化”,反问自己一些问题:
    1、类还有初始化?不是只有对象才有初始化吗?
    2、类为什么要初始化?
    3、在哪里初始化类?
    4、到底是什么类在初始化?自己找答案,多看源码,即使新版MFC取消了这种方式,那也一定有更好的方式,最好单步跟踪代码执行过程。
      

  3.   

    呃。。在做了几个试验之后,总算了解这么做的意义了。总结一下吧。
    假设
    class Test:public CObject
    {
          DECLARE_DYNAMIC(Test)
    }
    IMPLEMENT_DYNAMIC(Test,CObject)void FuncInitClass(CRuntimeClass* pNewClass)
    {
        pNewClass-> m_pNextClass=CRuntimeClass::pFirstClass;
        CRuntimeClass::pFirstClass=pNewClass; 
    }
    1.之所以不用全局函数实现修改CRuntimeClass中的pFirst指针,原因:
        用全局函数FuncInitClass可以实现修改该指针,但是由于在全局范围内无法调用该函数,必须要在函数中才能调用该函数。(这个该书前几页,作者好像有提到过)如果在main()函数中调用该全局函数,则需要用户手动添加代码,而且需要让用户理解CRuntimeClass的内部实现。所以这种方法不可取。2.我在网上搜到过类似问题,有人问,为什么不在CRuntimeClass的构造函数里面执行这两个操作呢?
    我试了下,是可以的。。
      

  4.   

    struct RunTimeClass
    {
    LPCSTR m_lpszClassName;
    RunTimeClass* m_pBaseClass;
    static RunTimeClass* pFirstClass;
    RunTimeClass* m_pNextClass; RunTimeClass(LPCSTR name,RunTimeClass*,RunTimeClass*);
    };
    RunTimeClass* RunTimeClass::pFirstClass=NULL;//构造函数,实现初始化和修改链表的工作
    RunTimeClass::RunTimeClass(LPCSTR name,RunTimeClass* base,RunTimeClass* next):m_lpszClassName(name),m_pBaseClass(base),m_pNextClass(next)
    {
    m_pNextClass=RunTimeClass::pFirstClass;
    RunTimeClass::pFirstClass=this;
    }class Base               //基类
    {
    public:
    static RunTimeClass classBase;
    };static char _lpszBase[]="Base";
    RunTimeClass Base::classBase(_lpszBase,NULL,NULL);
    class Test:public Base   //派生类
    {
    public:
    static RunTimeClass classTest;
    };
    static char _lpszTest[]="Test";
    RunTimeClass Test::classTest(_lpszBase,&Base::classBase,NULL);int main()
    {
    Test t;
    return 0;
    }
      

  5.   

    囧。。只能连续回复3次。以上代码基本模拟了深入浅出MFC中的DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏的操作。
    把宏变成了代码实现结果证实,CRuntimeClass的修改操作可以通过其构造函数实现,并非一定需要 AFX_CLASSINIT这个结构才能实现。
    看了下VS2008中这个结构的代码,发现有些改变,但是做的操作大体上还是一样的。所以我觉得还是得问,定义这个结构,然后靠这个结构的构造函数取实现CRuntimeClass链表的修改操作,有什么意义呢?怎么感觉像是多此一举呢~?
      

  6.   

    坐等5楼大牛出现继续指点啊。。囧
    您昨天的问题我想了一天多。。想来想去觉得有道理,但是好像又没关系~您指的类初始化是类静态成员的初始化吗?google baidu确实没搜到相关的资料。
    被您这几个反问弄得茶饭不思啊~~~~诚心求教~~