2012-03-05 11 views
0

私はこれを説明する方法があまりにも分かりませんが、私は試してみます。C++/Qt、派生オブジェクトの変数名をリストとして取得していますか?

私はrownrとパーティションNRを持つオブジェクトAを持っています。 B、CはAから継承し、いくつかの他の変数を追加します(それらのget/setter)

次に、作成するA(B、C ...など)から派生した変数を取りますオブジェクトが持つ変数と同じ列を持つデータベース/テーブル内のレコード。例えば

class A { 
    int paritionKey; 
    int rowKey; 

    set/get for them both 
} 

class B : A { 
    string color; 

    ... 
} 

つの表は、その後、 "B" と呼ばれ、3列のPartitionKey、のrowKey及び色を有するであろう。

ハードこれをコーディングしない方法はありますか?または、最善の方法は、テーブル内の新しい行を構築するために使用されるXMLリクエストボディの一部を返すクラスにtoStringメソッドを作成することでしょうか?データベースにC++オブジェクトの自動マーシャリングを行う方法がある場合は、あなたが求めているよう

答えて

4

を(RESTを使用して)ですね。短い答えはいいえ、これを行うためのC++言語の組み込みの方法はありません。あなたのtoString()メソッドは悪いアプローチではありませんが、それぞれのクラスに対してtoString()(そしてある時点ではfromString())メソッドを書く必要があります...それはあまりにも多くの作業であるかどうかあなたがサポートする必要のあるクラスの数に依存します。

Qt's property system - QObjectからデータオブジェクトをサブクラス化しても構わない場合は、各プロパティのゲッターメソッドとともにQ_PROPERTY宣言を使用してクラス定義を飾ることができます。 QtのQMetaObjectクラスを使用して、指定されたQObjectのすべての宣言されたプロパティを汎用的に反復処理するジェネリックコードを記述します。これは、Qtのmocプリプロセッサ(Qtを使用している場合は、とにかく実行している)がQ_PROPERTYマクロを解析し、必要なグルーコードを自動生成できるためです。最後のステップ(QObjectのデータをmyObject-> metaObject() - > property(int)を反復処理し、各プロパティのmyObject-> property(propName)を呼び出して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" のため同じロジック。

関連する問題