循环访问类的所有公共方法
Iterate through all public methods of a class
是否可以
在使用qt5时迭代和打印我在应用程序中创建的所有函数的名称?
例如,假设我创建了自己的类(myClass),其中包含两个公共插槽
int add(int a, int b);
int mul(int a, int b);
我想要的是稍后在某个时候能够按名称打印myClass包含这两个函数。
如果你做了一些准备,你可以使用 QMetaObject 来实现这一点。使用methodCount()
您可以找到已发布方法的数量,使用method(int idx)
您可以访问QMetaMethod
对象。
要求是:
- 该类必须是
QObject
的子类 - 必须在类主体中使用
Q_OBJECT
宏 - 该类必须通过
moc
编译 - 不是插槽或信号的方法必须使用
Q_INVOKABLE
更新:
对于您的示例,您可以使用以下内容:
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();
}
}
}
这并不容易实现,但只要付出一些努力,它可能是可行的。
您可以自定义一些现有的C++编译器来执行此操作。例如,您可以使用 MELT 自定义最近的 GCC 编译器(g++
4.8 或 4.9 版),但这可能需要您至少花费一两个星期的工作。
您还可以在可执行文件的调试版本(或至少是非剥离版本)上运行nm -C
。这将向您显示所有C++符号。
如果你只关心Qt插槽,moc
正在提取这些。
附言。你的问题不清楚。准确定义要显示的名称。
相关文章:
- 通过方法访问结构
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 类变量无法从类方法访问
- 为什么从静态方法访问非静态方法是糟糕的设计
- 子类是否也在 c++ 中继承私有数据成员?但通过超类的公共方法访问
- 如何从回调方法访问自定义类成员
- 使初始化变量可供多个属性初始化方法访问
- 从c++中的方法访问指向对象的专用指针数组
- C++如何通过回调方法访问成员变量
- "undefined reference"从静态方法访问的模板类的静态成员
- 如何从方法访问类成员
- 类静态方法访问其静态数据成员
- 从静态方法访问非静态成员的工作示例
- 类方法访问其数据成员
- 通过公共方法访问私有成员变量
- 为什么无法从模板方法访问此类自己的受保护成员?
- 通过非静态方法访问静态成员
- JNI保留对对象的全局引用,并使用其他JNI方法访问它.在多个JNI调用中保持C++对象的活动状态
- 如何让一个方法访问其他模板类实例的私有成员
- 方法访问C++中的对象实例化