【转】C++反射机制的实现

 1 在Java编程中,我们经常要用到反射,通过反射机制实现在配置文件中的灵活配置, 但在C++编程中,对这种方式步提供现有的支持,那么我们怎么才能在配置文件中配置想要调用的对象呢?
 2 
 3 我们的思路是通过对象名称确定对象实例,把对象名和对象实例通过哈希表进行映射,那么我们就可以实现通过对象名称获取对象了。首先定义一个结构:
 4 
 5 struct ClassInfo
 6 
 7 {
 8 public:
 9  
10  string Type;
11  funCreateObject Fun;
12  ClassInfo(string type, funCreateObject fun)
13  {
14   Type = type;
15   Fun = fun;
16   Register(this);
17  }
18 };
19 
20 其中Register这样定义
21 
22 bool Register(ClassInfo* ci);
23 
24 然后定义一个类,头文件如下:
25 
26 class AFX_EXT_CLASS DynBase  
27 {
28 public:
29  DynBase();
30  virtual ~DynBase();
31 
32 public
33  static bool Register(ClassInfo* classInfo);
34  static DynBase* CreateObject(string type);
35 
36 private
37  static std::map<string,ClassInfo*> m_classInfoMap;
38 };
39 
40 cpp文件如下:
41 
42 std::map< string,ClassInfo*> DynBase::m_classInfoMap = std::map< string,ClassInfo*>();
43 
44 DynBase::DynBase()
45 {
46 
47 }
48 
49 DynBase::~DynBase()
50 {
51 
52 }
53 
54 bool DynBase::Register(ClassInfo* classInfo)
55 
56  m_classInfoMap[classInfo->Type] = classInfo; 
57  return true
58 }
59 
60 DynBase* DynBase::CreateObject(string type)
61 {
62  if ( m_classInfoMap[type] != NULL ) 
63  { 
64   return m_classInfoMap[type]->Fun();
65  }
66  return NULL;
67 }
68 
69 那么我们实现映射的类只要继承于DynBase就可以了,比如由一个类CIndustryOperate
70 
71 头文件如下
72 
73 class CIndustryOperate : public DynBase
74 {
75 public:
76  CIndustryOperate();
77  virtual ~CIndustryOperate();
78 
79  static DynBase* CreateObject(){return new CIndustryOperate();}
80 
81 private:
82  static ClassInfo* m_cInfo;
83 };
84 
85 cpp文件如下:
86 
87 ClassInfo* CIndustryOperate::m_cInfo = new ClassInfo("IndustryOperate",(funCreateObject)( CIndustryOperate::CreateObject));
88 
89 CIndustryOperate::CIndustryOperate()
90 {
91 
92 }
93 
94 CIndustryOperate::~CIndustryOperate()
95 {
96 
97 }

98 这样CIndustryOperate这个类就真正实现了反射机制!来源:http://blog.csdn.net/iwouldwin/archive/2006/08/24/1113002.aspx

posted @ 2009-07-04 23:01  吴碧宇  阅读(4125)  评论(0编辑  收藏  举报