反射是 java 的一个强大功能,我们往往有“根据类名创建该类实例的需求”,也就是说通过字符串就可以获得类实例。这种需求在 c++ 中也是存在的,下面分享一下在 c++ 中通过宏定义来实现类似功能的思路。
1、创建共同的基类。
我们需要为被“反射
”的类,创建一个共同的基类。我们创建如下的 Base
基类, work()
方法主要是打印出不同内容,以和其他子类做区分。
基类 Base.h
#pragma once
#include <stdio.h>
#include "Factory.h"
class Base {
public:
Base() {
printf("base class is created\n"); };
virtual ~Base() {
};
virtual void work() {
printf("base class is work\n"); }
};
2、 创建工厂类
先不着创建子类,我们有了基类后,就可以先实现一个工厂类 Factory
。核心方法就是 registerClass()
和 registerClass()
,前者向 Factory 注册类,后者则实现通过字符串来创建类实例。classPool 则保存注册的类名和其对应的构造方法。
Factory.h
#pragma once
#include <vector>
#include <utility>
class Base;
typedef Base* (*CREATER)();
class Factory
{
public:
static Factory* getInstance();
/// <summary>
/// 注册类到 Factory 中
/// </summary>
/// <param name="className">类名称</param>
/// <param name="creater">该类对应的静态构造方法</param>
void registerClass(const char *className, CREATER creater);
/// <summary>
/// 通过类名创建类实例
/// </summary>
/// <param name="className">类的名称</param>
/// <returns>该类的一个实例</ret