实现用类名来动态创建类

王朝other·作者佚名  2006-08-18
窄屏简体版  字體: |||超大  

突发奇想写了这个非常简单,但是很有用的东西:

需要 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);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航