c++实现类java反射:从类名字符串创建对象

前言

最近在项目中,需要用到从类名来创建C++类对象,类似于Java中的反射。C++没有反射的概念,所以是没办法和Java一样通过类名来创建对象。

思考了几种方式之后,我得到了一种性能和代码上都比较不错的方式。如果急着寻求方案,可以直接滑到总结处。

核心思路

众多方式,其实本质的核心思路是一样的:使用一个Map来保存字符串和创建对象的函数

写个伪代码大概就是这样

std::map<std::string,std::function<...>> registerMap;

void registerObject(std::function<...>) {
    ...;
    registerMap.insert(...);
}

Object createObject(const std::string& name) {
    ...;
    return registerMap[name]();
}

那么现在就有两个重要问题需要解决:

  1. map中的function类型如何确定
  2. 如何优雅地对类型进行注册

注册function类型

注册的function,需要创建并返回我们需要的对象类型,例如我们需要创建一个Student对象:

std::unique_ptr<Student> create(const std::string name) {
    return std::unique_ptr<Student>(new Student(name));
}

但是我们会发现,我们必须指定function的返回值以及构造参数模板,而每个对象的所对应的返回值和构造函数参数都不同,因此需要进行统一。

  • 对于构造函数参数,这里全部设计为无参,并将初始化逻辑迁移到init方法中,这样可以简化构建的逻辑。
  • 返回值类型,可以让所有需要反射创建对象的类继承同个基类,这样可以统一函数的返回值类型。随后再通过dynamic_cast进行指针转型。

这里我们设计顶层的基类是Object,注意其析构函数必须为虚函数:

class Object {

public:
    virtual ~Object() = default;
};

我们的注册函数类型可以设计为:std::function<std::unique_ptr<Object>()>。这里采用智能指针的原因是告诉调用方需要自己负责对象内存的释放,避免造成内存泄露。

设计后的函数接口是:

using RegisterFunc = std::function<std::unique_ptr<Object>()>
std::map<std::string ,RegisterFunc> obje
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值