开源中文网

您的位置: 首页 > 编程开发 > C++语言编程 > 正文

实现用类名来动态创建类

来源:  作者:

突发奇想写了这个非常简单,但是很有用的东西: 
需要 boost 库支持 

文件名: Runtimeclass.hpp 


#include <map> 
#include <string> 
#include <boost/function.hpp> 
// Write by Jadedrip (Jadedrip@gmail.com) 
#ifndef _TSTRDEFINED 
#define _TSTRDEFINED 
#ifdef _UNICODE 
#define tstring std::wstring 
#else 
#define tstring std::string 
#endif 
#endif 

class RuntimeClassFactory 

private: 
typedef boost::function<void*()> RUNTIME_CREATE_REF; 
protected: 
typedef std::map< tstring, RUNTIME_CREATE_REF > class_map; 
static class_map& cmap(){ 
static class_map m_map; 
return m_map; 

public: 
static void register_class( tstring name, RUNTIME_CREATE_REF p ){ 
(cmap())[name]=p; 

static void* create( tstring name ){ 
if( cmap().find( name )!=cmap().end() ) 
return (cmap()[name])(); 
else 
return NULL; 

}; 

template<typename T> 
struct ClassObject 

ClassObject(const tstring class_name){ RuntimeClassFactory::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)); 
#define REGISTER_CLASS_BY_NAME(X,CLASSNAME) ClassObject<X> __class_help_##X(_T(CLASSNAME)); 

===================== 我是分隔线 =============================== 
使用相当简单,定义好类以后, 在类定义的后面加上 REGISTER_CLASS(X) 然后就可以用 
RuntimeClassFactory::create(_T("classname")); 来创建类了, 返回值是 void* 类型的指针。 

比如 

class A{ 
... 
}; 
REGISTER_CLASS(A) 

void main() 

tstring class_name=_T("A"); 
A* a=(A*)RuntimeClassFactory::create(class_name); 

Tags:类名 动态
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明