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

来源:互联网 发布:mac bt下载工具 编辑:程序博客网 时间:2024/05/22 04:32

下面是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  
05static std::map< string,ClassInfo*> *classInfoMap = NULL;
06using namespace std;
07IMPLEMENT_CLASS(Object)
08bool 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}
20Object* 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 
29bool 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 
05class Object;
06class ClassInfo;
07 
08typedef Object* (*ObjectConstructorFn)(void);
09bool Register(ClassInfo* ci);
10using namespace std;
11 
12class ClassInfo
13{
14public:
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;}
25public:
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 
50class Object
51{
52    DECLARE_CLASS(Object)
53public:
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<iostream>
02#include<cstring>
03#include "DynBase.h"
04using namespace std;
05 
06class A : public Object
07{
08    DECLARE_CLASS(A)
09public :
10    A(){cout<<hex<<(long)this<<" A constructor!"<<endl;}
11    ~A(){cout<<hex<<(long)this<<" A destructor!"<<endl;}
12};
13IMPLEMENT_CLASS(A)
14 
15class B : public Object
16{
17    DECLARE_CLASS(B)
18public :
19    B(){cout<<hex<<(long)this<<" B constructor!"<<endl;}
20    ~B(){cout<<hex<<(long)this<<" B destructor!"<<endl;}
21};
22IMPLEMENT_CLASS(B)
23 
24int main()
25{
26    Object* p = Object::CreateObject("A");
27    delete p;
28    system("pause");
29    return 0;
30}