Qt反射机制的实现
Jave C#自带的反射机制极大的方便了开发者,同时也有利的增加了程序的灵活度。开发者可以把类注册到程序中,然后通过配置文件自动生成类,掉用类的相关函数。那么C++不支持反射,我们可不可以自己构造呢?答案是当然。
如何通过字符串生成类呢:思路如下
把类的构造函数和字符串绑定到map/hashmap中,创建对象的时候通过hash表映射,得到类的构造函数,直接生成对象。
不多说,直接上代码。
核心代码
class ObjectFactory
{
public:
template<typename T>
static void registerClass()
{
constructors().insert(T::staticMetaObject.className(), &constructorHelper<T>);
}
template<typename T>
static void registerClass(const QString& name)
{
constructors().insert(name, &constructorHelper<T>);
qDebug() << name << constructors().size();
}
static QObject* createObject( const QString& className, QObject* parent = NULL )
{
Constructor constructor = constructors().value( className );
if ( constructor == NULL )
return NULL;
return (*constructor)( parent );
}
private:
typedef QObject* (*Constructor)( QObject* parent );
template<typename T>
static QObject* constructorHelper( QObject* parent )
{
return new T( parent );
}
static QHash<QString, Constructor>& constructors()
{
static QHash<QString, Constructor> instance;
return instance;
}
};
注册的时候调用registerClass
创建对象的时候调用creatorObjeect
我是这样实现的:
注册:
#define REGISTER_OBJECT(className, name) \
ObjectFactory::registerClass<className>(name);
void RegisterObject::initialize()
{
REGISTER_OBJECT(SteponeNode, "STEP_ONE")
REGISTER_OBJECT(StepTowNode, "STEP_TOW")
REGISTER_OBJECT(StepThreeNode, "STEP_THREE")
}
创建:
QObject *AbstractNodeFactory::create(const QString &name)
{
QObject *obj = ObjectFactory::createObject(name);
return obj;
}
通过以上就可以实现C++的反射啦。
效果
图中
图中 stepOne , stepTow, stepThree是通过字符串创建的三个线程。
结尾
反射机制极大的是软件开发者应对变化的需求变得灵活起来。一些大厂,wps等直接把控件封装起来,通过xml文件去调用控件,界面布局等。这样修改界面颜色布局等等就变成只是改xml文件的事情了。解放程序员,从反射做起。
下面是Demo地址:https://download.csdn.net/download/Mario_z/16248729