2013-06-08 5 views
0

Я делаю несколько экспериментов на Qt. Я пытаюсь прочитать все свойства, аннотированные с Q_PROPERTY дочернего класса в его родительском классе. Мои классы выглядеть следующим образом:Как родительский класс может видеть свойства своего дочернего класса?

class ParentClass : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(ParentProperty...) 
    //class stuff... 
} 

class ChildClass : public ParentClass 
{ 
    Q_OBJECT 
    Q_PROPERTY(ChildProperty...) 
    //class stuff 
} 

Теперь я хочу, чтобы прочитать все свойства родительского класса, но я могу читать только родительское свойство. Как я могу получить свойства дочернего класса? Есть ли удобный способ для этого?

+0

Почему, по-вашему, вам это нужно? Родительский класс никогда не должен знать о дочерних классах, поэтому я уверен, что в дизайне вашего класса есть проблема. –

+0

Мое намерение состояло в том, чтобы создать простую в использовании систему ввода/вывода базы данных. Поэтому пользователю просто нужно определить свойства (атрибуты), которые он хочет хранить в базе данных в своем классе, который наследуется от родительского класса, где уже определены некоторые атрибуты. Родительский класс должен читать все свойства своего дочернего элемента и строить таблицы со всеми свойствами в качестве атрибутов. Я мог бы разделить его, но тогда пользователь должен самостоятельно зарегистрировать свой собственный класс собственности. – Paul

+0

Теперь, если пользователь не хочет, чтобы его атрибуты подкласса сохранялись в базе данных? Или что, если он даже не знает, что базовый класс получит доступ к свойствам подкласса? Вы должны скорее создать метод шаблона в базовом классе, а затем вызвать его из подкласса: 'registerProperty (« height », & m_height);' или что-то похожее, в зависимости от того, как работает ваша программа. Но основное правило: ** никогда ** доступ к подклассу из базового класса. Без исключений. –

ответ

0

Обычно вы не должны ссылаться на какой-либо дочерний класс в родительском классе. Это нарушает идею классового наследования.

Если вы уверены, что вам нужно это сделать, вы должны преобразовать указатель объекта в ChildClass*, а затем использовать его свойства.

void ParentClass::needToGoDeeper() { 
    ChildClass* obj = qobject_cast<ChildClass*>(this); 
    if (obj) { 
    int count = obj->metaObject()->propertyCount(); 
    //... 
    } 
} 
+0

Как вы собираетесь создавать «ChildClass *» без включения файла дочернего класса, создавая цикл включения? –

+0

Если вы включили «ChildClass.h» в начало «ParentClass.cpp» (не «ParentClass.h»), то не будет цикла включения. –

+0

О, ну, глупо меня. Тем не менее, вы все равно не должны советовать кому-либо об этом. –

Смежные вопросы