由于最近工作中用到工厂模式来创建不同的窗口对象在主窗口中显示, 以前遇到类似的情况我都是把所有需要创建的窗口类头文件都包含到主窗口MainWnd.cpp中, 这样每新增一个窗口, 就需要修改 MainWnd.cpp 。MainWnd.cpp 也就需要重新编译。 后来百度了下c++反射, 有用Qt 元对象机制的(Qt继承自QObject 的类是可以支持反射的); 有用模版实现的类工厂, 然后需要反射的类从该类继承; 也有模仿MFC 的(需要在类的声明和实现中加入相关宏)... 感觉都有点麻烦。
后来再百度下有没有用 c++11, 或者 boost 实现的, 但好像没找到, 于是今天我闲着无聊就自己写一个基于C++11语法的类名反射。 最终成型后, 功能对于我来说已经满足。
用法是:
1> 在需要反射的类cpp 中调用宏 ReflectRegister 注册子类
2> 在策略函数中, 包含基类头文件, 然后根据子类的类名创建对象。
代码如下:
/* @file ObjFactory.h
* @brief 根据子类名创建对象。可注册构造函数参数个数任意的类
*
* 用法:假设 BaseShape 有 2 个派生类: Rectangle 和 Triangle 。 3个类分别在不同的文件中
* , BaseShape 有个纯虚函数 virtual void draw() = 0;
* @code:
* // BaseShape.h
* class BaseShape
{
public:
virtual void draw() = 0;
};
// Rectangle.cpp
#inclu