在Qt中获取超类中子类的名称

时间:2013-12-19 08:58:39

标签: c++ qt qstring qtcore qdebug

我有一个由两个子类继承的基类。所有三个类都使用qDebug()进行一些调试打印,使用Q_FUNC_INFO来识别打印源。问题是当从基类打印时,Q_FUNC_INFO包含基类的名称,使得无法知道实例所代表的两个子类中的哪一个。

到目前为止,我提出的最佳解决方案是在基类中使用QString变量而不是Q_FUNC_INFO,并在实例化时为其提供正确的名称。

还有其他更优选的解决方案吗?

1 个答案:

答案 0 :(得分:3)

  

还有其他更优选的解决方案吗?

一般来说,不,那很好。在这种情况下,如果可能的话,您需要将Q_FUNC_INFO放入子类中。如果没有,你运气不好,但是......请继续阅读。

Qt内部也使用显式字符串而不是Q_FUNC_INFO,我部分认为是因为这个原因。

对于QObjects,您可以使用元对象编译器进行一些内省动态获取真实姓名,即:

  

const char * QMetaObject :: className()const

     

返回类名。

  

const QMetaObject * QObject :: metaObject()const [virtual]

     

返回指向此对象的元对象的指针。

     

元对象包含有关继承QObject的类的信息,例如:类名,超类名,属性,信号和插槽。包含Q_OBJECT宏的每个QObject子类都将有一个元对象。

     

信号/插槽连接机制和属性系统需要元对象信息。 inherits()函数也使用了元对象。

     

如果没有指向实际对象实例的指针但仍希望访问类的元对象,则可以使用staticMetaObject。

在处理构造函数时,您也会看一下这个,因为您的注释似乎表明了这一点:

  

QMetaMethod QMetaObject :: constructor(int index)const

     

返回具有给定索引的构造函数的元数据。

的main.cpp

#include <QObject>
#include <QDebug>

class Foo : public QObject
{
    Q_OBJECT
    public:
        virtual void baz() {  qDebug() << "Class name:" << metaObject()->className(); }
};

class Bar : public Foo
{
    Q_OBJECT
};

#include "main.moc"

int main()
{
    Bar bar;
    bar.baz();
    return 0;
}

输出

moc main.cpp -o main.moc && g++ -Wall -I/usr/include/qt -I/usr/include/ -I/usr/include/qt/QtCore -lQt5Core -fPIC main.cpp && ./a.out

Class name: Bar

注意:如果您希望在构造函数中使用此机制,那么简单的答案是您不能。没有什么能真正帮助你。这是因为在C ++中如何处理继承。首先,构造基类,并且在那个阶段,子类尚未完全构造(严格来说,甚至不是基础),因此如果没有明确确定基类的附加参数,您无法真正获得有关它的更多信息构造函数。但是,你会得到一个膨胀的API只是为了这个简单的事情。在这种情况下,我建议将print放入子类而不是基类。