1.CRuntimeClass DECARE_DYNAMIC()
CRuntimeClass没有基类。 每个由CObject派生的类都与一个CRuntimeClass结构相联系,用户可以使用该结构获取一个对象及其基类的运行时信息。当需要额外的函数参数检查时,或当用户必须根据一个对象的类编写特殊目的代码时,在运行时确定该对象的类就非常有用。C++并不直接支持运行时类的信息。
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName; //存放asscii类名的以空字符结尾的字符串
int m_nObjectSize; //以字节为单位给出对象的大小
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
CRuntimeClass* m_pBaseClass;
#endif
// Operations
CObject* CreateObject();
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
// dynamic name lookup and creation
static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);
static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);
static CObject* PASCAL CreateObject(LPCSTR lpszClassName);
static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);
// Implementation
void Store(CArchive& ar) const;
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);
// CRuntimeClass objects linked together in simple list
CRuntimeClass* m_pNextClass; // linked list of registered classes
const AFX_CLASSINIT* m_pClassInit;
};
总之,DECARE_DYNAMIC()宏其实只是为了在类中添加:
Static CRuntimeClass ClassCCmdTarget; //静态变量
Virual CRuntimeClass *GetRuntimeClass() const; //成员函数
DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏.
IMPLEMENT_DYNAMIC(CView,CWnd) "运行时类型识别"
替换结果如下:
Static char _lpszCView[] = “CView”;
CRuntimeClass CView::classCView = {_lpszCView,sizeof(CView),0xFFFF,NULL,&CWnd::classCWnd,NULL};
static AFX_CLASSINIT _init_CView(&CView::classCView);
CRuntimeClass *CView::GetRuntimeClass() const{ return &CView::classCView;}
**CObject作为链表的表头,不能直接套用宏,要特别处理.
原文链接: https://www.cnblogs.com/belie8/archive/2011/08/11/2135498.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/30355
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!