微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Qt的元对象系统获取对象实例类名称

如何解决使用Qt的元对象系统获取对象实例类名称

我有3个班级:

class Being : public QObject {
    Q_OBJECT
public:
    explicit Being(QObject *parent = nullptr);
};

class Animal : public Being {
    Q_OBJECT
public:
    explicit Animal(QObject *parent = nullptr);
};

class Dog : public Animal {
    Q_OBJECT
public:
    explicit Dog(QObject *parent = nullptr);
};

实现如下:

Being::Being(QObject *parent) : QObject(parent) {
    qDebug() << staticMetaObject.className();
}

我有以下代码

Being *pBeing = new Being();
Being *pAnimal = new Animal();
Being *pDog = new Dog();

问题是:有一种方法可以实现Being的构造函数,以便我可以访问指向我的Being基类的实际实例,以便上述代码的日志为:

Being
Animal
Dog

编辑: 我的意图是,我希望能够有一个Animal.txtBeing.txtDoc.txt可以在Being基类中进行处理。而且我需要根据实例的类型知道是否需要解析Animal.txtBeing.txtDoc.txt以获得更多信息。

Qt支持吗?我是否可以使用一种机制来使用C ++ / Qt实现此目的?如果没有,是否可以为此提供任何优雅的折衷解决方案?

解决方法

Being的构造函数中是不可能的,因为尚未构造封闭的对象,因此有关该对象的元数据不可用。但是,您可以编写initialize方法,该方法应在对象构造后调用,例如具有打印功能:

class Being : public QObject {
    Q_OBJECT
public:
    explicit Being(QObject *parent = nullptr) { qDebug() << this->metaObject()->className(); }  // this will always print "Being"
    void initialize() { qDebug() << this->metaObject()->className(); }  // this will print the actual class name
};

class Animal : public Being {
    Q_OBJECT
public:
    explicit Animal(QObject *parent = nullptr) { initialize(); }  // you can already use this method in the constructor
};

TEST(xxx,yyy)
{
    Being* being = new Being();
    Being* animal = new Animal();
    being->initialize();
    animal->initialize();  // or you can call it later
}

如果initialize方法不是很好的解决方案,则可以始终通过Being构造函数:explicit Being(QString name,QObject* parent = nullptr;然后是explicit Animal(QObject *parent = nullptr): Being("Animal") {}对其进行修改,但我认为它不太优雅。

,

我的意图是我希望能够有一个Animal.txt,Being.txt和Doc.txt,它们将在Being基类中进行处理。而且我需要根据实例的类型知道是否需要解析Animal.txt,Being.txt或Doc.txt以获得更多信息。

从不让基类知道有关其子类的任何信息。曾经。

无论它看起来有多诱人,都不要这样做(即使您知道如何)。

一个类可能具有数百个子类。以QObject为例。 QObject(或者可能)应该知道您对QMainWindow的重新实现吗?

因此,无论出于何种原因做出此设计决定,更改它!

可能的解决方案

如果文本文件的处理算法相同,则不管其子类是什么,请创建一个基类方法进行处理,然后从子类中调用它。

如果算法依赖于子类,则将方法抽象化,即virtual并且不带实现(=0),然后将实现放到子类中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。