Qt实现反射机制

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文件的事情了。解放程序员,从反射做起。

猜你喜欢

转载自blog.csdn.net/Mario_z/article/details/115337818