DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏

第一次接触DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC这个宏一头雾水,特别在MFC深入浅出的时候遇到它,完全不明白它是做什么的,在此学习一下:


#define DECLARE_DYNAMIC(class_name) 


\public: 


\ static CRuntimeClass class##class_name;


\ virtual CRuntimeClass* GetRuntimeClass() const;




##,用來告訴編譯器,把兩個字串联在一起:


上述代码具体含义如下:
如果执行DECLARE_DYNAMIC(CView)


编译器会为你执行一下代码:


public:
static CRuntimeClass  classCView;
virtual CRuntimeClass* GetRuntimeClass() const;


这个可能有点简单,然后来一个复杂的:


如下:


#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \

 _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)

#define RUNTIME_CLASS(class_name) \ (&class_name::class##class_name)

struct AFX_CLASSINIT { AFX_CLASSINIT(CRuntimeClass* pNewClass); };

#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name,wSchema,pfnNew) \ static char _lpsz##class_name[] = #class_name; \ CRuntimeClass class_name::class##class_name = { \ _lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \ RUNTIME_CLASS(base_class_name), NULL }; \ static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \ CRuntimeClass* class_name::GetRuntimeClass() const \ { return &class_name::class##class_name; } 

// in header file

class CView : public CWnd{ DECLARE_DYNAMIC(CView) ...};

// in implementation file

IMPLEMENT_DYNAMIC(CView, CWnd)



上述结构展开:
//in header file
class CView:public CWnd{
static CRuntimeClass  classCView;
virtual CRuntimeClass* GetRuntimeClass() const;
...}
// in implementation file
IMPLEMENT_DYNAMIC(CView, CWnd)
=_IMPLEMENT_RUNTIMECLASS(CView, CWnd,0xFFFF,NULL)
=static char _lpszCView[] = "CView";\
 CRuntimeClass CView::classCView = { \
 _lpszCView, sizeof(CView), 0xFFFF, NULL, \
RUNTIME_CLASS(CWnd), NULL }; \ 
 static AFX_CLASSINIT _init_CView(&CView::classCView); \
 CRuntimeClass* CView::GetRuntimeClass() const \
{ return &CView::classCView; }
=static char _lpszCView[] = "CView";\
CRuntimeClass CView::classCView = { \
_lpszCView, sizeof(CView), 0xFFFF, NULL, \
RUNTIME_CLASS(CWnd), NULL }; \ 
static AFX_CLASSINIT _init_CView(&CView::classCView); 
 CRuntimeClass* CView::GetRuntimeClass() const \
{ return &CView::classCView; }
=static char _lpszCView[] = "CView";\
CRuntimeClass CView::classCView = { \
 _lpszCView, sizeof(CView), 0xFFFF, NULL, \
(&class_name::classCView), NULL }; \ 
static AFX_CLASSINIT _init_CView(&CView::classCView); \
CRuntimeClass* CView::GetRuntimeClass() const \
{ return &CView::classCView; }


其实难度也没什么就是一个简单的替换~中间有个特有意思的的结构体“构造函数”,我还是第一次知道结构体还有构造函数:
struct AFX_CLASSINIT
 { AFX_CLASSINIT(CRuntimeClass* pNewClass); };
=AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
 CRuntimeClass::pFirstClass = pNewClass;
}


但是上述方法对CObject根源类是不好用的所以有了以下的设计:
// in header file
class CObject
{
 DECLARE_DYNAMIC(CObject)
 ...
};
// in implementation file
IMPLEMENT_DYNAMIC(CObject)
结果如下:
// in header file
class CObject
{
public:
 virtual CRuntimeClass* GetRuntimeClass() const;
 ...
public:
 static CRuntimeClass classCObject;
};
// in implementation file
static char szCObject[] = "CObject";
struct CRuntimeClass CObject::classCObject =
 { szCObject, sizeof(CObject), 0xffff, NULL, NULL };
static AFX_CLASSINIT _init_CObject(&CObject::classCObject);
CRuntimeClass* CObject::GetRuntimeClass() const
{
 return &CObject::classCObject;
}


相对前者会有继承的消失,以及CWnd的消失。

总结:IMPLEMENT_DYNAMIC是实现“运行时类型识别”宏,与之相对应的是DECLARE_DYNAMIC(声明“运行时类型识别”宏)。也就是说你在.CPP文件中如果看见有IMPLEMENT_DYNAMIC,则在.H文件中必定有DECLARE_DYNAMIC的声明。 
DECLARE_DYNAMIC/DEClARE_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏。 
DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE是为了“动态创建"类的实例而定义的宏。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值