#if !defined _XDYNAMICCREATE_H__
#define _XDYNAMICCREATE_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class XDynamicCreate
{
public:
XDynamicCreate();
virtual ~XDynamicCreate();
typedef void * (WINAPI * CREATE_FUNC)();
typedef map<CString,LPVOID> mapClassFun;
//static map<CString,LPVOID> m_mapClassToFun;
//这里要使用静态函数,如果在外部声明静态变量,则调用m_mapClassToFun崩溃
static mapClassFun& GetMapClassFun()
{
static mapClassFun mapClassToFun;
return mapClassToFun;
}
//该函数不用查找是否存在strclass,因为调用REGISTER_CLASS会保证调用一次,否则出现重定义
static void register_class( CString strClass, LPVOID pFunCreate )
{
GetMapClassFun()[strClass] = pFunCreate;
}
static void* Create(CString strClass )
{
map<CString,LPVOID>::iterator it = GetMapClassFun().find(strClass);
if(it == GetMapClassFun().end())
{
return NULL;
}
else
{
CREATE_FUNC pFunCreate = (CREATE_FUNC)(*it).second;
return pFunCreate();
}
}
};
template<typename T>
struct ClassObject
{
ClassObject(const CString class_name)
{
XDynamicCreate::register_class( class_name, &ClassObject<T>::create_object );
}
static void* create_object(){ return new T; }
};
//##标示连接,#标示当字符串使用
#define REGISTER_CLASS(X) ClassObject<X> __class_help_##X(_T(#X));
#endif
使用:1调用REGISTER_CLASS
class XMqSender : ISender
{
public:
XMqSender();
virtual ~XMqSender();
public:
void Send();
};
REGISTER_CLASS(XMqSender)
2.调用
CString strClassName = "XMqSender";
ISender * pSender = (ISender *)XDynamicCreate::Create(strClassName);
原理主要是根据静态函数会事先进行加载保存到一内存块。事先根据类名和对应的函数进行整对存取。和runtimeclass原理类似,不过这里不用管理类的父子关系。
#define _XDYNAMICCREATE_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class XDynamicCreate
{
public:
XDynamicCreate();
virtual ~XDynamicCreate();
typedef void * (WINAPI * CREATE_FUNC)();
typedef map<CString,LPVOID> mapClassFun;
//static map<CString,LPVOID> m_mapClassToFun;
//这里要使用静态函数,如果在外部声明静态变量,则调用m_mapClassToFun崩溃
static mapClassFun& GetMapClassFun()
{
static mapClassFun mapClassToFun;
return mapClassToFun;
}
//该函数不用查找是否存在strclass,因为调用REGISTER_CLASS会保证调用一次,否则出现重定义
static void register_class( CString strClass, LPVOID pFunCreate )
{
GetMapClassFun()[strClass] = pFunCreate;
}
static void* Create(CString strClass )
{
map<CString,LPVOID>::iterator it = GetMapClassFun().find(strClass);
if(it == GetMapClassFun().end())
{
return NULL;
}
else
{
CREATE_FUNC pFunCreate = (CREATE_FUNC)(*it).second;
return pFunCreate();
}
}
};
template<typename T>
struct ClassObject
{
ClassObject(const CString class_name)
{
XDynamicCreate::register_class( class_name, &ClassObject<T>::create_object );
}
static void* create_object(){ return new T; }
};
//##标示连接,#标示当字符串使用
#define REGISTER_CLASS(X) ClassObject<X> __class_help_##X(_T(#X));
#endif
使用:1调用REGISTER_CLASS
class XMqSender : ISender
{
public:
XMqSender();
virtual ~XMqSender();
public:
void Send();
};
REGISTER_CLASS(XMqSender)
2.调用
CString strClassName = "XMqSender";
ISender * pSender = (ISender *)XDynamicCreate::Create(strClassName);
原理主要是根据静态函数会事先进行加载保存到一内存块。事先根据类名和对应的函数进行整对存取。和runtimeclass原理类似,不过这里不用管理类的父子关系。