QtQMetaData类名实现
Qt QMetaData classname implementation
本文关键字:实现 QtQMetaData 更新时间:2023-10-16
我一直在查找调用className()的QMetaData和QObject。我想在我自己的类中复制这一点,但我不知道QT是如何做到的。我的意思是,我做了以下操作,但它没有输出正确的类(忽略任何语法错误):
#include <iostream>
#define CLASS(name)
std::string className() {
return #name;
}
class A {
public:
CLASS(A)
A(){}
~A(){}
void output() {
std::cout << className() << std::endl;
}
};
class B: public A{
public:
CLASS(B)
B(){}
~B(){}
};
int main() {
B b;
b.output(); // This obviously outputs "A" but I would
// like it to output "B" from the base class
// function
return 0;
}
Qt的作用是,您不必再添加任何代码,只需添加Q_OBJECT宏,并且即使基类具有输出函数(在Qt中,我指的是QObject::debugObjectTree()),您也可以从基类中获得派生类的className。Qt如何在不向派生类(可能除了宏)添加任何额外代码的情况下实现这种效果,在派生类中基类可以输出其派生类的类名?
提前谢谢。
为此需要动态调度(即c++中的虚拟函数)。
只需在宏中的std::string className()
之前添加virtual
:
#define CLASS(name)
virtual std::string className() {
return #name;
}
http://ideone.com/Kr0Sc
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- QtQMetaData类名实现