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

动态创建c++类对象

2007-12-14 16:49 666 查看
#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原理类似,不过这里不用管理类的父子关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: