【问题标题】:Qt QMetaData classname implementationQt QMetaData 类名实现
【发布时间】:2012-07-21 19:11:44
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: c++ qt class classname


    【解决方案1】:

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

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

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

    http://ideone.com/Kr0Sc

    【讨论】:

    • 谢谢!我不知道解决方案会这么简单!我忘了 virtual 允许你覆盖成员函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多