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