此前做项目用过C#和JAVA提供的反射机制的支持,C++没有直接提供,需要自己实现,经过一段时间的思考,我想到用宏定义的方式来实现把字符串映射成类的方法
#include "stdafx.h"
#include "stdlib.h"
#include <string>
#include <map>
using namespace std;
class BaseClass
{
public:
virtual bool DoWork()const=0;
};
typedef BaseClass* (*CreateObjectFunctionPtr)();
namespace ClassFactory
{
map<string,CreateObjectFunctionPtr> regClassList;
void RegisterClass(string strKey,CreateObjectFunctionPtr CreateObjFun)
{
regClassList.insert(pair<string,CreateObjectFunctionPtr>(strKey,CreateObjFun));
}
BaseClass* CreateInstance(string className)
{
CreateObjectFunctionPtr createFun=NULL;
for(map<string,CreateObjectFunctionPtr>::iterator it=regClassList.begin();it!=regClassList.end();it++)
{
if(className==(*it).first)
{
createFun=(*it).second;
}
}
if(createFun)
{
return createFun();
}
return NULL;
}
void ReleaseObject(BaseClass * instance)
{
if(instance)
{
delete instance;
instance=NULL;
}
}
}
#define REG_CLASS(ClassName) ClassFactory::RegisterClass(#ClassName,ClassName::CreateInstance)
#define REFLECTABLE_CLASS(ClassName) public:\
static BaseClass *CreateInstance(){\
BaseClass* ref=(BaseClass *)new ClassName();\
return ref;\
}\
class SubClass1:public BaseClass
{
REFLECTABLE_CLASS(SubClass1)
public:
bool DoWork() const
{
printf("I'm SubClass1\n");
return true;
}
};
class SubClass2:public BaseClass
{
REFLECTABLE_CLASS(SubClass2)
public:
bool DoWork() const
{
printf("I'm SubClass2\n");
return true;
}
};
int main(int argc, char *argv[])
{
REG_CLASS(SubClass1); //注册类
REG_CLASS(SubClass2); //注册类
//SubClass * subClassInstance;
BaseClass *instance ;
instance=ClassFactory::CreateInstance("SubClass2");
if(instance)
{
instance->DoWork();
}
ClassFactory::ReleaseObject(instance);
system("pause");
return 0;
}