#include "stdafx.h"
#include <cstdio>
#include <string>
#include <cstring>
#include <map>
#include <iostream>
using namespace std;
#define IMPL_CLASS_CREATE(class_name) \
static base* CreateClass##class_name(){ \
return new class_name; \
};
#define DECLARE_CLASS_CREATE(class_name) \
static base* CreateClass##class_name();
class base{
public:
base(){}
virtual ~base(){}
};
class A : public base{
public:
A(){std::cout<< "A" << endl;}
};
class B : public base{
public:
B(){std::cout<< "B" << endl;}
};
class C : public base{
public:
C(){std::cout<< "C" << endl;}
};
IMPL_CLASS_CREATE(A);//声明类的Create函数
IMPL_CLASS_CREATE(B);
IMPL_CLASS_CREATE(C);
//定义Create函数指针
typedef base* (*CreateClass)();
#define CREATE_CLASS(_msgCall) (CreateClass)(&_msgCall)
//反射机制中的表
static std::map<std::string, CreateClass> CreateList;
class Factory{
public:
static void registerClass(std::string var, CreateClass fun)
{
CreateList[var] = fun;
}
static base* createByString(std::string var)
{
return (CreateList.find(var)->second)();
}
};
#define REGISTER_CLASS(class_name) \
Factory::registerClass(#class_name, CREATE_CLASS(CreateClass##class_name))
int main()
{
REGISTER_CLASS(A);
REGISTER_CLASS(B);
REGISTER_CLASS(C);
base* pA = Factory::createByString("A");
base* pB = Factory::createByString("B");
base* pC = Factory::createByString("C");
system("pause");
return 0;
}