头文件如下:
/*
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为反射机制。
*/
#ifndef _HEADER_H_
#define _HEADER_H_
#include<iostream>
#include<map> //增加散列表查询
#include<string>
using namespace std;
//////////////////////////////////////////////////////////////////////////
typedef void* (*CreateFuntion)(void); //定义函数指针CreateFuntion
//保存类和对应创建函数之类的映射
class ClassFactory
{
public:
/*定义一个静态方法,通过类名查找类*/
static void* GetClassByName(std::string name)
{
/*定义一个散列表的迭代器,用于遍历存放类的散列表*/
map<string, CreateFuntion>::const_iterator find;
/*通过迭代器实例化的对象find定位需要查找的类;
用find()函数查找,返回的是一个指向该元素的迭代器*/
find = clsMap().find(name);
/*如果返回的迭代器不在散列表里,则返回空,否则返回对应的键值(即类对象)*/
if (find == clsMap().end())
{
return NULL;
}
else
{
return find->second();
}
}
/*定义一个类的静态插入方法*/
static void RegistClass(string name, CreateFuntion method)
{
/*表示已经插入一个类*/
cout << "Regist Class " << name << endl;
clsMap().insert(make_pair(name, method));
}
private:
/*创建一个map对象的引用函数,返回一个map对象*/
static map<string, CreateFuntion>& clsMap();
};
map<string, CreateFuntion>& ClassFactory::clsMap()
{
static map<string, CreateFuntion> *s_clsMap = new map<string, CreateFuntion>(); //只进行一次初始化
return *s_clsMap;
}
class RegistyClass
{
public:
RegistyClass(string name, CreateFuntion method)
{
/*调用工厂类里的插入类方法!*/
cout << "RegistyClass Construct!\n";
ClassFactory::RegistClass(name, method);
}
};
/*定义模板类*/
template<class T, const char name[]>
class Register
{
public:
Register()
{
const RegistyClass tmp = rc;
}
/*定义一个创建插入类对象的方法*/
static void* CreateInstance()
{
return new T;
}
public:
static const RegistyClass rc;
};
/* '/'表示换行符,将一段过长的代码分成几段,下一行紧接当前这一行代码的后面
##表示强制间断;#表示后面跟着的量转换成字符串
*/
#define DEFINE_CLASS(class_name) \
char NameArray##class_name[] = #class_name; \
class class_name :public Register<class_name, NameArray##class_name>
#define DEFINE_CLASS_EX(class_name,father_class) \
char NameArray##class_name[] = #class_name; \
class class_name :public Register<class_name, NameArray##class_name>, public father_class //表示继承
//////////////////////////////////////////////////////////////////////////
#endif
主文件如下:
#include <string>
#include <map>
#include <iostream>
#include "Header.h"
//定义并初始化rc静态变量,通过这一步,静态变量初始化特性,实现类和对应的创建函数的自动注册
template<class T, const char name[]>
const RegistyClass Register<T, name>::rc(name, Register<T, name>::CreateInstance);
//测试类
DEFINE_CLASS(CG)
{
public:
void Display()
{
cout<<"I am Here\n";
}
};
//另外一个测试注册功能的类
char className[] = "TestClass";
class TestClass :public Register<TestClass, className>
{
public:
void test()
{
cout<<"Test\n";
}
private:
int a;
};
int main(void)
{
//bug,因为没有执行自动注册,所以tmp为NULL了
CG* tmp = (CG*)ClassFactory::GetClassByName("CG");
tmp->Display();
TestClass *pTmp = (TestClass*)ClassFactory::GetClassByName("TestClass");
pTmp->test();
system("pause");
return 0;
}