您的位置:首页 > 编程语言 > C语言/C++

C++实现反射机制

2013-10-30 11:27 423 查看

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: