【发布时间】:2020-11-05 13:56:11
【问题描述】:
我有 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::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
?
编辑:
我的意图是我希望能够在 Being 基类中处理 Animal.txt、Being.txt 和 Doc.txt。而且我需要知道,根据实例的类型,我是否需要解析Animal.txt、Being.txt 或Doc.txt 以获取更多信息。
Qt 支持这个吗?有没有一种机制我可以使用 C++/Qt 来实现这一点?如果没有,是否有任何优雅的折衷解决方案?
【问题讨论】:
-
在 Being::Being 构造函数中你绝对需要这个吗?一旦构造了对象,您就可以引用元对象,但这在那时是不可能的(封闭对象尚未完全构造)
-
不一定在构造函数中,但我需要一种机制来知道,在我的 Being 类中,实例的类型为
Being、Animal或Dog... -
如果这是为了调试,那就是
metaObject->className()。如果您打算在类名上调度,请改用多态性。 -
不,这不仅仅是为了调试,请参阅我的编辑。我的自动机制会根据所使用的实例类型收集更多信息。
标签: c++ qt qt5 qmetaobject qmetatype