科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件实现用类名来动态创建类

实现用类名来动态创建类

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:翡翠水滴 来源:CSDN 2008年3月21日

关键字: 创建 动态 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

突发奇想写了这个非常简单,但是很有用的东西:
需要 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);
}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章