C++ 实现通过类名来进行实例化(反射机制?)
参考:http://blog.csdn.net/cen616899547/article/details/9317323
目的:让一些类能通过他的类名来进行实例化,配合抽象工厂模式的使用
思路:1.有一个单例factory类,其成员map<string, createClass> m_classMap ;存放类名及相应的初始化函数。
2.每一个需要目的功能的类,都需要有一个静态CKDynamicClass*成员和静态createInstance函数,在CKDynamicClass*成员定义的时候,将该类的类名及相应的初始化函数作为参数传入,并注册进factory的map中。
##是宏定义中的连接字符
#是让参数变为字符串,如#t -> "t"
上代码:
工厂类
#ifndef FACTORY_H #define FACTORY_H #include <iostream> #include <map> #include <string> using std::string; using std::map; using std::pair; //定义一个函数指针 typedef void* (*createClass)(void) ; class CKClassFactory { public: virtual ~CKClassFactory(){} ; //通过类名进行实例化的函数 void* getClassByName(string className) { map<string, createClass>::const_iterator iter ; iter = m_classMap.find(className) ; if ( iter == m_classMap.end() ) return NULL ; else return iter->second() ; } //注册函数,name - 类名 ,method - createInstance方法 void registClass(string name, createClass method) { m_classMap.insert(pair<string, createClass>(name, method)) ; } //获取工厂实例,单例模式 - 恶汉模式 static CKClassFactory& sharedClassFactory(){ static CKClassFactory _sharedClassFactory ; return _sharedClassFactory ; } ; private: CKClassFactory(){}; map<string, createClass> m_classMap ; } ; //方便使用 #define myfactory CKClassFactory::sharedClassFactory() #endif
CKDynamicClass类,两个宏方便声明和定义 CKDynamicClass*和createInstance
#ifndef KDynamicClass_H #define KDynamicClass_H #include "factory.h" /* * 在构造函数中注册类名及相应实例化函数 * 下面的两个宏,是方便定义CKDynamicClass*和createInstance */ class CKDynamicClass { public: CKDynamicClass(string name, createClass method) { CKClassFactory::sharedClassFactory().registClass(name, method) ; } } ; #define DECLARE_CLASS(className)\ private:\ static CKDynamicClass* m_##className##dc ;\ public:\ static void* createInstance() {return new className();} #define IMPLEMENT_CLASS(className) \ CKDynamicClass* className::m_##className##dc = \ new CKDynamicClass(#className, &className::createInstance) ; #endif
需要目的功能的类:使用上面定义的两个宏
#ifndef TESTCLASS_H #define TESTCLASS_H #include "dynamicclass.h" /* * 在需要能通过类名进行初始化的类中, * 包含头文件,并添加这两个宏就可以了 */ class test{ DECLARE_CLASS(test) public: test(){ std::cout << "hello test" << std::endl; } ~test(){ std::cout << "good bye test" << std::endl; } }; IMPLEMENT_CLASS(test) #endif
main函数:
#include <iostream> #include "testclass.h" using namespace std; int main(){ test *b = (test *)myfactory.getClassByName("test"); delete b; system("pause"); }