Qt实现反射机制

本文介绍如何在C++中模拟Java和C#的反射机制,通过字符串动态生成对象。使用一个名为`ObjectFactory`的类,将类名与构造函数映射到哈希表中,实现按需创建对象。注册类使用`registerClass`宏,创建对象调用`createObject`方法。这种机制增强了程序的灵活性,类似大厂中通过XML配置文件动态生成界面元素的技术。
摘要由CSDN通过智能技术生成

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值