由类名创建对象

来源:互联网 发布:昆山大数据产业园招聘 编辑:程序博客网 时间:2024/06/11 20:58

#pragma once

#include "shengli_tool/template_map_str.h"
using namespace SHENGLI::TOOLS;

// 用于声明具有动态创建功能的基类
#define DECLARE_DYNCRT_BASE(base) /
public: /
    typedef base* (*ClassGen)(); /
    static void Register(const char* class_name, ClassGen class_gen) /
    { /
        MapStr<base::ClassGen>& class_set = base::get_class_set();/
        class_set.Set(class_name, class_gen);/
    } /
public:/
    static base* Create(const char* class_name) /
    { /
        base::ClassGen pfun;/
        MapStr<base::ClassGen>& class_set = base::get_class_set();/
        if (class_set.Find(class_name, pfun))/
        {/
            return (pfun)();/
        }/
        return NULL; /
    }/
protected: /
    static MapStr<base::ClassGen>& get_class_set()/
    { /
        static MapStr<base::ClassGen> class_set; /
        return map_set;/
    }/

// 用于实现基类
#define IMPLEMENT_DYNCRT_BASE(base)
    
// 用于声明一个能够被动态创建的类
#define DECLARE_DYNCRT_CLASS(derived, base) /
public: /
    struct derived##Register /
    { /
        derived##Register() /
        { /
            static bool bRegistered = false; /
            if(!bRegistered) /
            {/
                base::Register(#derived, Create); /
                bRegistered = true; /
            } /
        } /
    }; /
    static base* Create() /
    { /
        return new derived; /
    }

// 用于实现一个能够被动态创建的类  
#define IMPLEMENT_DYNCRT_CLASS(derived) /
static derived::derived##Register derived##_for_registering;

 

 

原创粉丝点击