现在的位置: 首页 > 综合 > 正文

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

2017年01月20日 ⁄ 综合 ⁄ 共 4072字 ⁄ 字号 评论关闭

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

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

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

 

参考了wxWidgets的相关代码,并进行简化,同时借鉴了网上的相关内容,改进之处在于,只需要继承基本类Object,在类的头文件中定义宏,DECLARE_CLASS(类名),在类的实现文件中定义宏,IMPLEMENT_CLASS(类名),即可,欢迎指正。 

代码以来的库都是C++标准库,所以不需要额外添加库。 

例如: 
#include<iostream>
#include<cstring>
#include "DynBase.h"
using namespace std;

class A : public Object
{
 DECLARE_CLASS(A)
public :
A(){cout<<hex<<(long)this<<" A constructor!"<<endl;}
~A(){cout<<hex<<(long)this<<" A destructor!"<<endl;}
};
IMPLEMENT_CLASS(A)

class B : public Object
{
 DECLARE_CLASS(B)
public :
B(){cout<<hex<<(long)this<<" B constructor!"<<endl;}
~B(){cout<<hex<<(long)this<<" B destructor!"<<endl;}
};
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
<map>
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
<string>
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] [全屏预览]

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

 

抱歉!评论已关闭.