迭代一个类的所有公共方法

时间:2015-01-29 13:53:27

标签: c++ qt

使用qt5时,是否可以迭代并打印我在应用程序中创建的所有函数的名称?

例如,假设我创建了自己的类( myClass ),其中包含两个公共广告位

int add(int a, int b);
int mul(int a, int b);

我想要的是稍后能够打印 myClass 按名称包含这两个功能。

2 个答案:

答案 0 :(得分:4)

如果您做了一些准备,可以使用QMetaObject。使用​methodCount(),您可以找到已发布方法的数量,method(int idx)可以访问QMetaMethod个对象。

要求是:

  1. 该类必须是QObject
  2. 的子类
  3. 您必须使用课程正文中的Q_OBJECT
  4. 必须通过moc
  5. 编译课程
  6. 必须使用Q_INVOKABLE
  7. 声明不是SLOT或SIGNAL的方法

    <强>更新
    对于您的示例,您可以使用此:

    class MyClass : public QObject {
        Q_OBJECT
    public slots:
       int add(int a, int b);
       int mul(int a, int b);
    public:
        Q_INVOKABLE int notaslot();
    };
    
    int main(int argc, char**argv) {
        MyClass obj;
        QMetaObject *mobj = obj.metaObject();
        for (int i = 0; i < mobj->methodCount(); ++i) {
           QMetaMethod method = mobj->method(i);
           if (method.access() == QMetaMethod::Public) {
              std::cout << method.name().toStdString();
           }
        }
    }
    

答案 1 :(得分:0)

您可以自定义一些现有的C ++编译器来执行此操作。例如,您可以使用GCC自定义最近的MELT编译器(g++版本4.8或4.9),但这可能至少需要一到两周的工作时间。

您还可以在可执行文件的调试版本(或至少非剥离版本)上运行nm -C。这将显示所有C ++符号。

如果您只关心Qt 广告位moc正在提取这些广告。

PS。你的问题不清楚。定义完全您要显示的名称。