下面是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;
}
标签: <无>
1. [文件] DynBase.cpp ~ 781B 下载(66)
05 | static std::map< string,ClassInfo*> *classInfoMap = NULL; |
07 | IMPLEMENT_CLASS(Object) |
08 | bool Object::Register(ClassInfo* ci) |
11 | classInfoMap = new std::map< string,ClassInfo*>(); |
14 | if(classInfoMap->find(ci->m_className) == classInfoMap->end()){ |
15 | classInfoMap->insert(std::map< string,ClassInfo*>::value_type(ci->m_className,ci)); |
20 | Object* Object::CreateObject(std::string name) |
22 | std::map< string,ClassInfo*>::const_iterator iter = classInfoMap->find(name); |
23 | if(classInfoMap->end() != iter) { |
24 | return iter->second->CreateObject(); |
29 | bool Register(ClassInfo* ci) |
31 | return Object::Register(ci); |
2. [文件] DynBase.h ~ 1KB 下载(68)
08 | typedef Object* (*ObjectConstructorFn)(void); |
09 | bool Register(ClassInfo* ci); |
15 | ClassInfo(const std::string className,ObjectConstructorFn ctor) |
16 | :m_className(className) ,m_objectConstructor(ctor) |
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;} |
27 | ObjectConstructorFn m_objectConstructor; |
30 | #define DECLARE_CLASS(name) \ |
32 | static ClassInfo ms_classinfo; \ |
34 | virtual ClassInfo* GetClassInfo() const; \ |
35 | static Object* CreateObject(); |
37 | #define IMPLEMENT_CLASS_COMMON(name,func) \ |
38 | ClassInfo name::ms_classinfo((#name), \ |
39 | (ObjectConstructorFn) func); \ |
41 | ClassInfo *name::GetClassInfo() const \ |
42 | {return &name::ms_classinfo;} |
44 | #define IMPLEMENT_CLASS(name) \ |
45 | IMPLEMENT_CLASS_COMMON(name,name::CreateObject) \ |
46 | Object* name::CreateObject() \ |
56 | static bool Register(ClassInfo* ci); |
57 | static Object* CreateObject(string name); |
06 | class A : public Object |
10 | A(){cout<<hex<<(long)this<<" A constructor!"<<endl;} |
11 | ~A(){cout<<hex<<(long)this<<" A destructor!"<<endl;} |
15 | class B : public Object |
19 | B(){cout<<hex<<(long)this<<" B constructor!"<<endl;} |
20 | ~B(){cout<<hex<<(long)this<<" B destructor!"<<endl;} |
26 | Object* p = Object::CreateObject("A"); |