1.    #define _IMPLEMENT_RUNTIMECLASS 
2.   (class_name,base_class_name,wSchema,pfnNew)\
3.    static char _lpsz##class_name[]=#class_name;\
4. CRuntimeClass class_name::class##class_name={\
5. _lpsz##class_name,sizeof(class_name),wSchema,pfnNew,\
6.    RUNTIME_CLASS(base_class_name),NULL};
(*7) static AFX_CLASSINIT _init_##class_name 
(*8)(&class_name_::class##class_name);\
9.  CRuntimeClass* class_name::GetRuntimeClass() const\
10.   {return &class_name::class##class_name;}\\\  struct AFX_CLASSINIT
\\  {AFX_CLASSINIT(CRuntimeClass* pNewClass);};\\ AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
\\{  pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
\\   CRuntimeClass::pFirstClass=pNewClass;
\\}
问题在第7.8两行.
 因为第7.8两行看不懂,所以想找本书参祥参祥.

解决方案 »

  1.   

    《深入浅出MFC》上的吧,可惜我也不懂,up
      

  2.   

    声名一个静态变量(同时初始化---第8行)--第7行   来向程序中注册你的新生成的类[通过这个变量的可构造函数自动运行,
    否则要手工AFX_MODULE_STATE::m_classList.AddHead(pNewClass);-----这种方法有短处]
    也就是为动态创建准备的以后只要用
    CObject::CreateObject(你的类名)就可生成一个对象
    ---在序列化时就会用到另外几句:
    因为映射中要用到字符串(指针),要直接比较字符串指针是否相同,所以要求为稳定的字符串地址---因此一般声名为永久性静态变量(可参见C++语言参考的变量永久性与临时性),同时也保证了数据唯一性,空间为o(1)每9行就是取出上面所声名的静态地址(也称回调地址---外面不能直接访问,但通过函数间接找到)