c++反射机制的实现(完整代码,相当靠谱)

下面是c++反射机制的一个实现,比较完整。出自:http://www.oschina.net/code/snippet_230828_9913

虽然这是windows下写的代码,但是比较合理,非人云亦云,很靠谱。我昨天说过实现一个优秀的c++反射机制,一定要和动态链接库扯上关系(个人认为)。

下面这篇文章,虽然没有扯上动态链接库,但是也是相当不错的了。关于我个人认为的c++反射机制完整优秀版本,以后我再推出分享。

 

参考了wxWidgets的相关代码,并进行简化,同时借鉴了网上的相关内容,改进之处在于,只需要继承基本类Object,在类的头文件中定义宏,DECLARE_CLASS(类名),在类的实现文件中定义宏,IMPLEMENT_CLASS(类名),即可,欢迎指正。  
代码以来的库都是C++标准库,所以不需要额外添加库。  
例如:  
#include
#include
#include "DynBase.h"
using namespace std;

class A :   public  Object
{
  DECLARE_CLASS(A)
public :
A(){cout<
~A(){cout<
};
IMPLEMENT_CLASS(A)

class B : public Object
{
  DECLARE_CLASS(B)
public :
B(){cout<
~B(){cout<
};
IMPLEMENT_CLASS(B)

int main()
{
Object* p = Object::CreateObject("A");
delete p;
    system("pause");
    return 0;
}

标签: <无>

代码片段(3)[全屏查看所有代码]

1. [文件] DynBase.cpp ~ 781B     下载(66)     

01 #include "StdAfx.h"
02 #include
03 #include "DynBase.h"
04   
05 static std::map< string,ClassInfo*> *classInfoMap = NULL;
06 using namespace std;
07 IMPLEMENT_CLASS(Object)
08 bool Object::Register(ClassInfo* ci)
09 {
10     if(!classInfoMap)   {
11         classInfoMap = new std::map< string,ClassInfo*>();
12     }
13     if(ci)  {
14         if(classInfoMap->find(ci->m_className) == classInfoMap->end()){
15             classInfoMap->insert(std::map< string,ClassInfo*>::value_type(ci->m_className,ci));
16         }
17     }
18     return true;
19 }
20 Object* Object::CreateObject(std::string name)
21 {
22     std::map< string,ClassInfo*>::const_iterator iter = classInfoMap->find(name);
23     if(classInfoMap->end() != iter)  {
24         return iter->second->CreateObject();
25     }  
26     return NULL;
27 }
28  
29 bool Register(ClassInfo* ci)
30 {
31     return Object::Register(ci);
32 }

2. [文件] DynBase.h ~ 1KB     下载(68)     

01 #ifndef __DYNBASE_H__
02 #define __DYNBASE_H__
03 #include
04  
05 class Object;
06 class ClassInfo;
07  
08 typedef Object* (*ObjectConstructorFn)(void);
09 bool Register(ClassInfo* ci);
10 using namespace std;
11  
12 class ClassInfo
13 {
14 public:
15     ClassInfo(const std::string className,ObjectConstructorFn ctor)
16     :m_className(className) ,m_objectConstructor(ctor)
17     {
18         Register(this);
19     }
20     virtual ~ClassInfo(){}
21     Object* CreateObject()const { return m_objectConstructor ? (*m_objectConstructor)() : 0;    }
22     bool IsDynamic()const { return NULL != m_objectConstructor;}
23     const std::string GetClassName()const { return m_className;}
24     ObjectConstructorFn GetConstructor()const{ return m_objectConstructor;}
25 public:
26     string m_className;
27     ObjectConstructorFn m_objectConstructor;
28 };
29  
30 #define DECLARE_CLASS(name) \
31     protected: \
32         static ClassInfo ms_classinfo; \
33     public:  \
34         virtual ClassInfo* GetClassInfo() const; \
35         static Object* CreateObject();
36  
37 #define IMPLEMENT_CLASS_COMMON(name,func) \
38     ClassInfo name::ms_classinfo((#name), \
39              (ObjectConstructorFn) func); \
40                           \
41     ClassInfo *name::GetClassInfo() const \
42         {return &name::ms_classinfo;}
43  
44 #define IMPLEMENT_CLASS(name)            \
45     IMPLEMENT_CLASS_COMMON(name,name::CreateObject) \
46     Object* name::CreateObject()                   \
47         { return new name;}
48  
49  
50 class Object
51 {
52     DECLARE_CLASS(Object)
53 public:
54     Object(){}
55     virtual ~Object(){}
56     static bool Register(ClassInfo* ci);
57     static Object* CreateObject(string name);
58 };
59  
60  
61 #endif

3. [文件] test.cpp ~ 579B     下载(61)     跳至 [1] [2] [3] [全屏预览]

view source
print ?
01 #include
02 #include
03 #include "DynBase.h"
04 using namespace std;
05  
06 class A : public Object
07 {
08     DECLARE_CLASS(A)
09 public :
10     A(){cout<long)this<<" A constructor!"<
11     ~A(){cout<long)this<<" A destructor!"<
12 };
13 IMPLEMENT_CLASS(A)
14  
15 class B : public Object
16 {
17     DECLARE_CLASS(B)
18 public :
19     B(){cout<long)this<<" B constructor!"<
20     ~B(){cout<long)this<<" B destructor!"<
21 };
22 IMPLEMENT_CLASS(B)
23  
24 int main()
25 {
26     Object* p = Object::CreateObject("A");
27     delete p;
28     system("pause"

你可能感兴趣的:(资料收藏(C/C++))