슈퍼 클래스 데이터를 반환 User 클래스에 선언 된 속성호출 가상 방법은 내가 두 개의 클래스가 하위 클래스의 메타 정보를 얻고 싶은
수작업으로 모든 메서드를 구현하지 않고도 어떻게 든 하위 클래스의 메타 정보를 가져올 수 있습니까?
슈퍼 클래스 데이터를 반환 User 클래스에 선언 된 속성호출 가상 방법은 내가 두 개의 클래스가 하위 클래스의 메타 정보를 얻고 싶은
수작업으로 모든 메서드를 구현하지 않고도 어떻게 든 하위 클래스의 메타 정보를 가져올 수 있습니까?
에서 호출됩니다. meta()
도 가상이거나 메소드가 될 필요가 없습니다. 프리 스탠딩 기능이어야하며, 전달하는 모든 객체에 적용됩니다. C++은 Java가 아닙니다.
예가 다음과 같습니다. 출력 :
objectName QVariant(QString, "")
id QVariant(int, 1)
// https://github.com/KubaO/stackoverflown/tree/master/questions/meta-derived-38268004
#include <QtCore>
void meta(QObject * obj) {
auto mo = obj->metaObject();
for (int i = 0; i < mo->propertyCount(); i++)
qDebug() << mo->property(i).name() << mo->property(i).read(obj);
}
struct DataObject : QObject {
Q_OBJECT
};
struct User : DataObject {
Q_PROPERTY(int id MEMBER m_id)
Q_OBJECT
int m_id { 1 };
};
int main() {
User user;
Q_ASSERT(user.metaObject()->propertyCount() == 2);
meta(&user);
}
#include "main.moc"
QObject::metaObject()
메소드 즉, QObject
기본 클래스의 메소드를 명시 적으로 호출하고 있습니다. (Class::method()
정적 발송입니다)하지 정적으로, 당신의 meta()
구현에서 QObject::
부분을 제거하고 그래서 metaObject()
의 가상 구현은 런타임
metaObject()
를 호출 할 필요가