rttim.h
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:2k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 5/22/98 8:50:33 AM
  5.   Comments: Runtime class
  6.  ************************************/
  7. #ifndef __RTTIMACROS_
  8. #define __RTTIMACROS_
  9. //This file contains macros used to simulate RTTI's and dynamic
  10. //creation of objects using only the class name.
  11. //Used by the DECLARE_DERIVED_CLASS
  12. //In fact, creating an object of this type adds a new element to the ma
  13. class CRuntimeClassControl
  14. {
  15. public:
  16. static CMapStringToPtr* m_pClassMap;
  17. CRuntimeClassControl(CString str, void* pFct)
  18. {
  19. if(!m_pClassMap)
  20. m_pClassMap = new CMapStringToPtr;
  21. ASSERT(m_pClassMap != NULL);
  22. (*m_pClassMap)[str] = pFct;
  23. }
  24. ~CRuntimeClassControl()
  25. {
  26. if(m_pClassMap){
  27. delete m_pClassMap;
  28. m_pClassMap = NULL;
  29. }
  30. }
  31. };
  32. //Put this macro inside the declaration of a base class for a
  33. //hierarchy. You can create objects of types derived from this
  34. //class calling the baseClassName::CreateObject with the class
  35. //name parameter. Each derived class must add its name and a pointer
  36. //to a factory method without parameters ( it must use 
  37. //the DECLARE_DERIVED_CLASS(derivedClassName,baseClassName) macro
  38. // Macro DECLARE_BASE_CLASS( baseClassName )
  39. #define DECLARE_BASE_CLASS(baseClassName) 
  40. typedef baseClassName* (*pfnCreateObjectFn)();
  41. public:
  42. virtual CString GetClassName() {return CString(#baseClassName);}
  43. static baseClassName* CreateObject(CString strClassName)
  44. {
  45. void* fnCreate = NULL;
  46. if( (*CRuntimeClassControl::m_pClassMap).Lookup(strClassName,fnCreate) )
  47. return ((pfnCreateObjectFn)(fnCreate))();
  48.  return NULL;
  49. };
  50. // In the derived classes must exist function CreateObject!
  51. // Macro DECLARE_DERIVED_CLASS(derivedClassName,baseClassName)
  52. #define DECLARE_DERIVED_CLASS(derivedClassName) 
  53. public:
  54. virtual CString GetClassName() {return CString(#derivedClassName);}
  55. static derivedClassName* CreateObject()
  56. {
  57. return new derivedClassName;
  58. };
  59. public:
  60. static CRuntimeClassControl m_rcc;
  61. // Macro IMPLEMENT_DERIVED_CLASS(derivedClassName,baseClassName) is implement of DECLARE_DERIVED_CLASS
  62. #define IMPLEMENT_DERIVED_CLASS(derivedClassName,baseClassName) 
  63. CRuntimeClassControl derivedClassName::m_rcc(#derivedClassName,derivedClassName::CreateObject);
  64. #endif //__RTTIMACROS_