0

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

提前致谢。

4

1 回答 1

1

为此,您需要动态调度(即 C++ 中的虚函数)。

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

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

http://ideone.com/Kr0Sc

于 2012-07-23T14:41:58.107 回答