主题:[讨论]关于MFC中IMPLEMENT_DYNAMIC宏的问题
yinsen823
[专家分:30] 发布于 2009-10-16 17:13:00
在IMPLEMENT_DYNAMIC宏的_IMPLEMENT_RUNTIMECLASS()宏中对当前类的CRuntimeClass静态结构初值设定时有将RUNTIME_CLASS(base_class_name)的返回值填充到m_pBaseClass的操作,我们知道RUNTIME_CLASS(base_class_name)的结果就是当前类基类的CRuntimeClass结构的地址,我的问题是我们使用时只在我们的派生类中使用了DECLARE_DYNAMIC宏,而其基类没有添加DECLARE_DYNAMIC宏,即基类中没有定义静态结构CRuntimeClass,那么在派生类中m_pBaseClasst填充的地址是怎么来的?不知道我的问题描述清楚没有,先谢谢大家帮我解答啦
回复列表 (共4个回复)
沙发
mrlzalex [专家分:260] 发布于 2009-10-18 10:03:00
你这样做编译都通不过,再说你这个问题没什么意义,就你的问题做出以下解答!
#define _RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
#ifdef _AFXDLL
#define RUNTIME_CLASS(class_name) (class_name::GetThisClass())
#else
#define RUNTIME_CLASS(class_name) _RUNTIME_CLASS(class_name)
#endif
class cX
{
有DECLARE_DYNAMIC(cX)则会有下面的
#ifdef _AFXDLL
static CRuntimeClass* PASCAL _GetBaseClass();
static CRuntimeClass* PASCAL GetThisClass();
#endif
}
可能出现的2种情况:
1.当以_AFXDLL进行链接时,你的基类没有DECLARE_DYNAMIC(cX)宏,自然没有GetThisClass()方法这样显然会编译报错。
2.当非_AFXDLL进行链接时,你的基类没有CRuntimClass这个成员同样会引进起编译报错。
////////////////////////////////////////////////////////////////////
打个广告,本人承接计算机WIN32类毕业设计,WEB程序设计,代码RMB:650,
加文档RMB:1000,具体价格视功能,做出来的东西绝对原创,保质保量。
////////////////////////////////////////////////////////////////////
板凳
yinsen823 [专家分:30] 发布于 2009-10-21 14:11:00
不好意思,你没弄懂我提问的意思。简而言之就是MFC中派生自CObject的类(非我们自己派生的)是否自动添加了DECLARE_DYNAMIC()宏,不然我觉得类中根本就没有定义其CRuntimeClass静态成员,何来其地址?而我们通常只在自己派生的类中添加DECLARE_DYNAMIC()。
3 楼
mrlzalex [专家分:260] 发布于 2009-10-22 08:53:00
回去好好学学C++的继承!你这样问只能说明你的C++没学好!你的问题没有任何意义!
我只说一点,父类的静态成员在所在的派生类中只有一份!本回答结合上面我的回答的
代码C++学的好的都会看懂的!如果有高手觉得我说的不正确可以来拍砖!
////////////////////////////////////////////////////////////////////
打个广告,本人承接计算机WIN32类毕业设计,WEB程序设计,代码RMB:650,
加文档RMB:1000,具体价格视功能,做出来的东西绝对原创,保质保量。
////////////////////////////////////////////////////////////////////
4 楼
yinsen823 [专家分:30] 发布于 2009-10-25 15:39:00
这种讨论对我来说没有任何意义,至于您认为的我的问题还是我自己解决吧!
我来回复