关于IMPLEMENT_DYNAMIC宏的问题
在mfc的IMPLEMENT_DYNAMIC 这个宏中,有一段代码不太明白
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \
//返回基类运行时信息结构的指针
CRuntimeClass* PASCAL class_name::_GetBaseClass() \
{ return RUNTIME_CLASS(base_class_name); } \
//初始化本类的运行时信息,依次为类名、大小,版本,NULL,基类
AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \
#class_name, sizeof(class class_name), wSchema, pfnNew, \
&class_name::_GetBaseClass, NULL }; \
//返回运行时类信息,重载了CObject的GetRuntimeClass,使得CObject中声明的接口对具体的派生类有效
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return RUNTIME_CLASS(class_name); } \
这段代码中,对于class##class_name这个结构体的赋值好像是在任何函数以及类之外的。
但是,我自己定义了一个结构体,作为静态变量,放到了类中,却不能在类的外部为这个结构体赋值。
请问这是问什么?谢谢
[解决办法]
因为class##class_name是一个静态变量(可以看看DECLARE_DYNAMIC实现),静态变量必须在类外进行初始化
[解决办法]
typedef struct Info{ public: string name; Info* pBaseClass; Info(string _name, Info* p) : name(_name), pBaseClass(p) {}}Info; #define CLASSINFO_IMPLEMENT(classname,baseclass) \ Info classname::info##classname = Info(#classname,CLASSTYPE(baseclass));\ Info* classname::GetClassInfo(){return &classname::info##classname;}