相关文章推荐
大方的泡面  ·  华南理工大学一流本科专业建设点名单(国家级+ ...·  2 周前    · 
酷酷的海豚  ·  点赞!湖北省鄂州市“向日葵亲子小屋”经验做法 ...·  1 月前    · 
玩足球的烈马  ·  使用事件类型创建工作订单模板 - ...·  11 月前    · 
痴情的黄花菜  ·  元素巨龙_百度百科·  1 年前    · 
至今单身的牛排  ·  林清平酒吧不雅视频是什么瓜?·  1 年前    · 
Code  ›  C++ 实现通过类名来进行实例化(反射机制?)开发者社区
string 反射机制 实例化
https://cloud.tencent.com/developer/article/1711477
开心的炒饭
1 年前
作者头像
forxtz
0 篇文章

C++ 实现通过类名来进行实例化(反射机制?)

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 源懒由码 > C++ 实现通过类名来进行实例化(反射机制?)

C++ 实现通过类名来进行实例化(反射机制?)

作者头像
forxtz
发布 于 2020-10-10 16:42:27
1.4K 0
发布 于 2020-10-10 16:42:27
举报

参考:http://blog.csdn.net/cen616899547/article/details/9317323

目的:让一些类能通过他的类名来进行实例化,配合抽象工厂模式的使用

思路:1.有一个单例factory类,其成员map<string, createClass> m_classMap ;存放类名及相应的初始化函数。

2.每一个需要目的功能的类,都需要有一个静态CKDynamicClass*成员和静态createInstance函数,在CKDynamicClass*成员定义的时候,将该类的类名及相应的初始化函数作为参数传入,并注册进factory的map中。

##是宏定义中的连接字符

#是让参数变为字符串,如#t -> "t"

上代码:

工厂类

#ifndef FACTORY_H
#define FACTORY_H
#include <iostream>
#include <map>
#include <string>
using std::string;
using std::map;
using std::pair;
//定义一个函数指针
typedef void* (*createClass)(void) ;
class CKClassFactory
public:
    virtual ~CKClassFactory(){} ;
    //通过类名进行实例化的函数
    void* getClassByName(string className)
        map<string, createClass>::const_iterator iter ;
        iter = m_classMap.find(className) ;
        if ( iter == m_classMap.end() )
            return NULL ;
            return iter->second() ;
    //注册函数,name - 类名 ,method - createInstance方法
    void registClass(string name, createClass method)
        m_classMap.insert(pair<string, createClass>(name, method)) ;
    //获取工厂实例,单例模式 - 恶汉模式
    static CKClassFactory& sharedClassFactory(){
        static CKClassFactory _sharedClassFactory ;
        return _sharedClassFactory ;
private:
    CKClassFactory(){};
    map<string, createClass> m_classMap ;
//方便使用
#define myfactory CKClassFactory::sharedClassFactory()
#endif

CKDynamicClass类,两个宏方便声明和定义 CKDynamicClass*和createInstance

#ifndef KDynamicClass_H
#define KDynamicClass_H
#include "factory.h"
 * 在构造函数中注册类名及相应实例化函数
 * 下面的两个宏,是方便定义CKDynamicClass*和createInstance
class CKDynamicClass
public:
    CKDynamicClass(string name, createClass method)
        CKClassFactory::sharedClassFactory().registClass(name, method) ;
#define DECLARE_CLASS(className)\
    private:\
    static CKDynamicClass* m_##className##dc ;\
    public:\
    static void* createInstance() {return new className();}
#define IMPLEMENT_CLASS(className)  \
    CKDynamicClass* className::m_##className##dc = \
    new CKDynamicClass(#className, &className::createInstance) ;
#endif

需要目的功能的类:使用上面定义的两个宏

#ifndef TESTCLASS_H
#define TESTCLASS_H
#include "dynamicclass.h"
 * 在需要能通过类名进行初始化的类中,
 * 包含头文件,并添加这两个宏就可以了
class test{
    DECLARE_CLASS(test)
public:
    test(){ 
        std::cout << "hello test" << std::endl;
    ~test(){ 
        std::cout << "good bye test" << std::endl;
IMPLEMENT_CLASS(test)
#endif

main函数:

#include <iostream>
#include "testclass.h"
using namespace std;
 
推荐文章
大方的泡面  ·  华南理工大学一流本科专业建设点名单(国家级+省级)_大学生必备网
2 周前
酷酷的海豚  ·  点赞!湖北省鄂州市“向日葵亲子小屋”经验做法 在全国会议上作典型发言
1 月前
玩足球的烈马  ·  使用事件类型创建工作订单模板 - Dynamics 365 Field Service | Microsoft Learn
11 月前
痴情的黄花菜  ·  元素巨龙_百度百科
1 年前
至今单身的牛排  ·  林清平酒吧不雅视频是什么瓜?
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号