gpt4 book ai didi

c++ - Qt QMetaData类名实现

转载 作者:行者123 更新时间:2023-11-28 08:00:32 25 4
gpt4 key购买 nike

我一直在寻找调用 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())。 Qt 是如何在不向派生类添加任何额外代码(除了宏)的情况下实现这种效果的,其中基类可以输出其派生类的类名?

提前致谢。

最佳答案

你需要dynamic dispatch (即 C++ 中的虚函数)为此。

只需在宏中的 std::string className() 之前添加 virtual:

#define CLASS(name)              \
virtual std::string className() { \
return #name; \
}

http://ideone.com/Kr0Sc

关于c++ - Qt QMetaData类名实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11614411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com