动态创建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原理类似,不过这里不用管理类的父子关系。
#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原理类似,不过这里不用管理类的父子关系。
相关文章推荐
- 利用map动态创建C++类对象
- javascript 动态创建SVG对象
- js 动态创建对象方法
- 动态创建JS对象
- javascript---使用createElement动态创建HTML对象
- c++动态加载dll中的类(用于实现依据字符串类名创建对象)
- C#如何根据字符串动态的创建对象(类)?
- 对象动态创建
- .net中实现运行时从字符串动态创建对象
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值【转】
- qml动态创建组件对象
- C++类对象创建过程揭密
- C++类对象创建过程揭密
- qml之动态创建销毁对象
- 动态创建对象
- C++编程思想学习——动态对象创建
- 实现运行时从字符串动态创建对象 选择自 shanyou 的 Blog
- 动态创建对象实例
- PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
- 动态对象创建(new/delete & malloc/free)