参考:http://blog.csdn.net/cen616899547/article/details/9317323
目的:让一些类能通过他的类名来进行实例化,配合抽象工厂模式的使用
思路:1.有一个单例factory类,其成员map
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");
}
原文链接: https://www.cnblogs.com/cycxtz/p/4871927.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/222967
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!