2012-03-05 152 views
0

我不太清楚如何解释这一点,但我会尝试。C++/Qt,获取派生对象变量名称列表?

我有一个对象A,它有一个rownr和分区nr。 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和颜色。

有没有任何方式不硬编码呢?或者最好的方法是在类中创建一个toString方法,该方法返回将用于构造表中新行的xml请求体的一部分? (使用REST)

回答

4

听起来好像你在问是否有办法将C++对象自动编组到数据库中。简短的答案是否定的,在C++语言中没有内置的方法来执行此操作。你的toString()方法并不是一个坏的方法,尽管它需要你为每个类写入toString()(以及可能在某些方面也从fromString())方法......这是否工作太多将取决于你需要支持多少个这样的类。

另外,你也可以看看Qt's property system - 如果你不介意从QObject继承你的数据对象,你可以用Q_PROPERTY声明和每个属性的getter方法来修饰你的类定义,然后你可以编写使用Qt的QMetaObject类以通用方式迭代任何给定QObject的所有声明属性的通用代码。这是有效的,因为Qt的moc预处理器(如果你使用Qt,你将会运行它)将解析Q_PROPERTY宏,它可以为你自动生成很多必要的粘合代码。您仍然需要编写最后一步(通过迭代遍历myObject-> metaObject() - > property(int)并为每个属性调用myObject-> property(propName))将QObject的数据转换为XML或SQL命令,但至少你可以用通用的方式做到这一点,而不必为每个班级编写单独的编组例程。

0

我使用的方法确实是一个“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”。