2012-03-05 3 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 메서드를 만드는 것이 가장 좋습니다. (REST 사용)

답변

4

C++ 객체를 데이터베이스로 자동 마샬링하는 방법이 있는지 묻는 것처럼 들립니다. 짧은 대답은 아니요, C++ 언어에 내장 된 방법이 없습니다. toString() 메서드는 나쁜 접근 방식이 아닙니다. 각 클래스에 대해 toString() 및 (어느 시점에서 fromString()) 메서드를 작성해야하지만 ... 너무 많은 작업이든 아니든간에 얼마나 많은 수업을 지원해야하는지에 달려 있습니다.

Qt's property system 다른 방법으로는 QObject에서 데이터 객체의 서브 클래스를 만들지 않는 경우 각 속성에 대한 getter 메서드와 함께 Q_PROPERTY 선언을 사용하여 클래스 정의를 꾸밀 수 있습니다. Qt의 QMetaObject 클래스를 사용하는 일반 코드를 작성하여 주어진 QObject의 모든 선언 된 속성을 일반 방식으로 반복합니다. 이것은 Qt의 moc 전처리 기가 (Qt를 사용하는 경우 어쨌든 실행됩니다) Q_PROPERTY 매크로를 구문 분석하고 필요한 접착제 코드를 자동으로 생성 할 수 있기 때문에 작동합니다. myObject-> metaObject() -> property (int)를 반복하고 각 속성에 대해 myObject-> property (propName)를 호출하여 QObject의 데이터를 XML 또는 SQL 명령으로 변환하는 마지막 단계를 직접 작성해야합니다. 적어도 각 클래스에 대해 별도의 마샬링 루틴을 작성하지 않고도 일반적인 방식으로이 작업을 수행 할 수 있습니다.

0

내가 사용하고있는 접근 방식은 실제로 "toString"또는 "toXml"입니다. xml의 hierachical 특성은이 작업에 완벽합니다. 도식적 :

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); 
} 

클래스 "C"에 대한 예컨대 :

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

같은 논리를 제공한다.

관련 문제