MFC中关于运行时类信息及动态创建对象的两个宏的意义(转)

http://blog.csdn.net/ligand/article/details/49839507

MFC运行时类信息

用途:

程序在运行时,获取对象类的信息及类的继承关系
 

实现:

1、定义的类必须继承自CObject类。
2、类内声明宏DECLARE_DYNAMIC(),类外实现宏IMPLEMENT_DYNAMIC()
3、使用:
[cpp] view plain copy
 
  1. BOOL CObject::IsKindOf(CRuntimeClass* pClass)//对象是否属于某个类  
  2. CRuntimeClass* GetRuntimeClass( );//获取对象运行时类信息,经常使用RUNTIME_CLASS(类名)代替。  


示例:

[cpp] view plain copy
 
  1. class CAnimal:public CObject  
  2. {  
  3.     DECLARE_DYNAMIC(CAnimal)  
  4. };  
  5. IMPLEMENT_DYNAMIC(CAnimal,CObject)  
  6.   
  7.   
  8. class CDog:public CAnimal  
  9. {  
  10.     DECLARE_DYNAMIC(CDog)  
  11. };  
  12. IMPLEMENT_DYNAMIC(CDog,CAnimal)  
  13.   
  14.   
  15. int main(int argc, char* argv[])  
  16. {  
  17.     printf("Hello World!\n");  
  18.     CDog dog;  
  19.     if(dog.IsKindOf(RUNTIME_CLASS(CAnimal)))  
  20.     {  
  21.           printf("dog is an animal\n");  
  22.     }  
  23.     CAnimal animal;  
  24.     CRuntimeClass* rt=animal.GetRuntimeClass();  
  25.     printf("运行时类信息,类名:%s,大小:%d,版本:%d\n",rt->m_lpszClassName,rt->m_nObjectSize,rt->m_wSchema);  
  26.     if(animal.IsKindOf(rt))  
  27.     {  
  28.           printf("animal is an animal\n");  
  29.     }  
  30.     return 0;  
  31. }  






 

动态创建对象

作用和意义:

 一般编程时,使用系统的类定义对象,调用对象的成员函数完成相关的功能。有了动态创建,由用户定义类,系统函数创建该类的对象,由底层代码创建上层类的对象。
 

实现:

1、定义类必须继承自CObject类。
2、类内声明宏DECLARE_DYNCREATE,类外实现宏IMPLEMENT_DYNCREATE
3、使用:


实例:

 

[cpp] view plain copy
 
  1. class CAnimal:public CObject  
  2. {  
  3.     DECLARE_DYNCREATE(CAnimal)  
  4. };  
  5. IMPLEMENT_DYNCREATE(CAnimal,CObject)  
[cpp] view plain copy
 
  1. class CDog:public CAnimal  
  2. {  
  3.      DECLARE_DYNCREATE(CDog)  
  4. };  
  5. IMPLEMENT_DYNCREATE(CDog,CAnimal)  
[cpp] view plain copy
 
  1. //定义动态创建对象的函数  
  2. void CreateInstance(CRuntimeClass* pClass)  
  3. {  
  4.     CObject *pObj=pClass->CreateObject();  
  5.     printf("对象地址:%p\n",pObj);  
  6.     printf("类名:%s\n",pClass->m_lpszClassName);  
  7.     delete pObj;  
  8. }  
[cpp] view plain copy
 
  1. int main(int argc, char* argv[])  
  2. {  
  3.     printf("Hello World!\n");  
  4.     CreateInstance(RUNTIME_CLASS(CDog));  
  5.     return 0;  
  6. }  


 

具体实现细节

 

类继承体系中每个类都定义一个CRuntimeClass类型的静态数据成员,并定义静态成员函数 _GetBaseClass、GetThisClass及虚函数GetRuntimeClass。

[cpp] view plain copy
 
    1. struct CRuntimeClass  
    2.   
    3. {  
    4.   
    5. // Attributes  
    6.   
    7.    LPCSTR m_lpszClassName;  
    8.   
    9.    int m_nObjectSize;  
    10.   
    11.    UINT m_wSchema; // schema number of the loaded class  
    12.   
    13.    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class  
    14.   
    15. #ifdef _AFXDLL     
    16.   
    17.    CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();  
    18.   
    19. #else  
    20.   
    21.    CRuntimeClass* m_pBaseClass;  
    22.   
    23. #endif  
    24.   
    25.   
    26.   
    27. // Operations   
    28.   
    29.    CObject* CreateObject();  
    30.   
    31.    BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;  
    32.   
    33.   
    34.   
    35. // dynamic name lookup and creation  
    36.   
    37.    static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);//搜AfxGetModuleState()->m_classList,如果不成功再search classes in shared DLLs, 即pModuleState->m_libraryList->m_classList  
    38.   
    39.    static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);  
    40.   
    41.    static CObject* PASCAL CreateObject(LPCSTR lpszClassName);//从类名字符串,用FromName返回对应的CRuntimeClass,然后调用CRuntimeClass的成员函数CreateObject()  
    42.   
    43.    static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);  
    44.   
    45.   
    46.   
    47. // Implementation  
    48.   
    49.    void Store(CArchive& ar) const;  
    50.   
    51.    static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);//从CArchive读入类名字符串,然后返回对应的CRuntimeClass的对象。  
    52.   
    53.   
    54. // CRuntimeClass objects linked together in simple list  
    55.   
    56.     CRuntimeClass* m_pNextClass;       // linked list of registered classes  
    57.   
    58.     const AFX_CLASSINIT* m_pClassInit;  
    59.   
    60. };  

posted on 2018-02-07 10:07  遥远飞行  阅读(318)  评论(0编辑  收藏  举报

导航