美文网首页我爱编程
C++中使用QT实现反射机制

C++中使用QT实现反射机制

作者: 氕氘氚0921 | 来源:发表于2018-06-11 17:07 被阅读28次

    1.反射机制

    反射机制在java中是一个非常重要的特性,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。C++本身是不支持反射机制的。

    2.研究背景

    由于工作中经常使用到通过if...else...来进行判断走到哪个函数内,会在代码中也一大堆的if...else...非常难看,而且不好维护,因此就想能不能试着实现一下JAVA的反射机制。
    一开始想到用函数指针,通过map来保存映射关系,写一个工厂模式的类。用过字符串也就是函数名来进行注册,之后这个工厂可以根据函数名来找不同的函数。
    后来无意间发现QT本身就有实现过反射机制,因此决定直接使用QT的反射机制来完成。

    3.具体实现

    首先要实现QT的反射机制,必须这个类是继承自QObject的类,因为QT在QObject中做了很多封装,使C++能够像JAVA一样写。
    其次要在该类中需要做反射的那个函数前写一个宏Q_INVOKABLE,用于声明。
    具体例子如下所示:

    class Test: public QObject
    {
        Q_OBJECT
    public:
        Test();
        ~Test();
        Q_INVOKABLE void func1();
    };
    

    在使用的时候也非常的方便,使用QMetaObject::invokeMethod方法即可。具体例子如下所示:

    void main(int argc, char *argv)
    {
        QCoreApplication app(argc, argv);
        Test test;
        QMetaObject::invokeMethod(test, "func1");
        app.exec();
    }
    

    这样就可以调用到func1()的方法了。

    4.其他操作

    有些函数需要使用返回值,入参出参等,以及多线程异步操作等。可以参看QT的帮助手册。

    相关文章

      网友评论

        本文标题:C++中使用QT实现反射机制

        本文链接:https://www.haomeiwen.com/subject/phpheftx.html