下面是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" ); |