C ++ / Qt, получая имя переменной производного объекта в виде списка? - PullRequest
0 голосов
/ 05 марта 2012

Я не совсем уверен, как это объяснить, но я постараюсь.

У меня есть объект A, у которого есть rownr и номер раздела.B, C наследуется от A и добавляет несколько других переменных (и get / setters для них)

Затем у меня есть функция, которая принимает переменную, полученную из A (B, C ... и т. Д.)создаст запись в базе данных / таблице с теми же столбцами, что и у переменных объекта.

Например:

class A {
   int paritionKey;
   int rowKey;

   set/get for them both
}

class B : A {
   string color;

   ...
}

Одна таблица будет называться "B" и будет иметь 3 столбца: partitionKey, rowKey и color.

Есть ли способ не сложно кодировать это?Или лучшим способом было бы создать метод toString в классах, который возвращает часть тела запроса xml, которая будет использоваться для создания новой строки в таблице?(используя REST) ​​

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

Звучит так, будто вы спрашиваете, существует ли способ сделать автоматическую сортировку объектов C ++ в базе данных.Краткий ответ - нет, в языке C ++ нет встроенного способа сделать это.Ваш метод toString () не является плохим подходом, хотя он требует от вас написания методов toString () (и, вероятно, в какой-то момент также из методаStString ()) для каждого из ваших классов ... будь то слишком много работы или нетбудет зависеть от того, сколько таких классов вам нужно поддерживать.

В качестве альтернативы вы также можете взглянуть на систему свойств Qt - если вы не возражаете против подкласса ваших объектов данных из QObject, вы можете украсить определения вашего класса с помощью объявлений Q_PROPERTY вместе сметоды getter для каждого свойства, а затем вы можете написать общий код, который использует класс Qt QMetaObject для итерации по всем объявленным свойствам любого данного QObject в общем виде.Это работает, потому что препроцессор moc в Qt (который вы все равно будете запускать, если будете использовать Qt) будет анализировать макросы Q_PROPERTY и может автоматически генерировать много необходимого для вас связующего кода.Вам все равно придется написать последний шаг (преобразование данных QObject в команды XML или SQL путем итерации по myObject-> metaObject () -> property (int) и вызова myObject-> property (propName) для каждого свойства),но, по крайней мере, вы можете сделать это в общем виде, без необходимости писать отдельную процедуру сортировки для каждого класса.

0 голосов
/ 05 марта 2012

Подход, который я использую, действительно является «toString» или, скорее, «toXml», иерархическая природа xml идеально подходит для этого.Схематично:

void A::toXml(QDomElement *parentEl)
{
   QDomeElement* el = parentEl->ownerDocument()->createElement("A");
   parentEl->apeendChild(el);
   el->setAttribute("paritionKey", paritionKey);
   el->setAttribute("rowKey", rowKey);
}

void B::toXml(QDomElement *parentEl)
{
   QDomeElement* el = parentEl->ownerDocument()->createElement("B");
   parentEl->apeendChild(el);
   el->setAttribute("color", color);

   A::toXml(el);
}

Что дает, например:

[...]
<B color="blue">
   <A partitionKey=2 rowKey=25/>
</B>
[...]

Та же логика для класса "C".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...