zoukankan      html  css  js  c++  java
  • 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! ");  
    18.     CDog dog;  
    19.     if(dog.IsKindOf(RUNTIME_CLASS(CAnimal)))  
    20.     {  
    21.           printf("dog is an animal ");  
    22.     }  
    23.     CAnimal animal;  
    24.     CRuntimeClass* rt=animal.GetRuntimeClass();  
    25.     printf("运行时类信息,类名:%s,大小:%d,版本:%d ",rt->m_lpszClassName,rt->m_nObjectSize,rt->m_wSchema);  
    26.     if(animal.IsKindOf(rt))  
    27.     {  
    28.           printf("animal is an animal ");  
    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 ",pObj);  
    6.     printf("类名:%s ",pClass->m_lpszClassName);  
    7.     delete pObj;  
    8. }  
    [cpp] view plain copy
     
    1. int main(int argc, char* argv[])  
    2. {  
    3.     printf("Hello World! ");  
    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. };  
  • 相关阅读:
    【禅道】禅道安装步骤
    软件测试学习路线
    【mysql】mysql数据库安装
    【用例】测试用例阶段总结
    【坑】自动化测试之Excel表格
    开始.....
    网络攻防
    PAT/查找元素习题集
    PAT/简单模拟习题集(二)
    PAT/简单模拟习题集(一)
  • 原文地址:https://www.cnblogs.com/yaoyuanfeixing/p/8425310.html
Copyright © 2011-2022 走看看