.NET、C#这些语言都在内部实现了反射技术,因此用起来很是得心应手,但是C++则没有实现反射,因此只有自己写程序实现了。首先感谢网络上的师傅们,要我自己实现怕是很困难,毕竟我也是刚开始学习,网上的教程很多,但是有一些很依赖具体的程序环境,如gcc等,我觉得很不爽,因此都没有参考。我要感谢http://blog.youkuaiyun.com/wrq147/article/details/5603262 这个文章的作者,我是看他的程序实现了反射机制,然后在他上面的情况下进行了一点点修改。如果有不足的情况请大家见谅,大家一起学习学习哈。首先我贴出我整理好的这位原作者的代码。
代码如下 reflection.h
#ifndef _REFLECTION_H_
#define _REFLECTION_H_
#include <iostream>
#include <map>
typedef void* (*CreateFuntion)(void);
/*
以下为工厂类,用来创建类和注册类
*/
class ClassFactory
{
public:
static void* GetClassByName(std::string name) {
std::map<std::string,CreateFuntion>::const_iterator find;
find=m_clsMap.find(name);
if(find==m_clsMap.end()) {
return NULL;
}else {
return find->second();
}
}
static void RegistClass(std::string name, CreateFuntion method) {
m_clsMap.insert(std::make_pair(name, method));
}
private:
static std::map<std::string, CreateFuntion> m_clsMap;
};
std::map<std::string, CreateFuntion> ClassFactory::m_clsMap;
class RegistyClass {
public:
RegistyClass(std::string name,CreateFuntion method) {
ClassFactory::RegistClass(name,method);
}
};
template<class T,const char name[]>
class Register {
public:
Register() {
//这个一定要加,因为编译器不保证程序开始时就初始化变量rc
const RegistyClass tmp=rc;
}
static void* CreateInstance() {
return new T;
}
public:
static const RegistyClass rc;
};
template<class T,const char name[]>
const RegistyClass Register<T, name>::rc(name, Register<T, name>::CreateInstance);
#define DEFINE_CLASS(class_name) \
char NameArray##class_name[] = #class_name;\
class class_name:public Regi