2017-01-09 6 views
0

나는 매우 객체 지향 코드의 설계에 경험하지하고 있기 때문에, 나는 다음과 같은 질문이 : 나는 콤보 cb_GRAN이Qt는 C++ 콤보 상자의 선택에 따라 객체를 생성

21 개 형상을 나타내는 21 항목 . 에서 만든 선택에 따라 cb_GRAN 내 기하학 표면의 다른 계산을 시작하고 싶습니다. 실제로 더 많은 계산이 필요합니다 : LineEdits 등의 전환에 대한 복잡한 계산이 필요하지만 간단하게 말하십시오. 표면의 계산.)

이 문제를 해결하기 위해 Geometry를 상속 한 Geometry 클래스와 21 개의 클래스 (Geo_1, Geo_2, ... Geo_21)를 만들었습니다.

Geometry *GEO; 
QVector < Geometry*> qvec_GEO  

qvec_GEO << new Geo_1()<< new Geo_2()<< new Geo_3()<<...... << new Geo_21() ; 

GEO = qvec_GEO[ui->cb_GRAN->currentIndex()]; 
GEO->calculateSurface(); 
  • 가가 될 것이다 : 나는 또한 Geo_x 작성하고 나는 다음과 같은 아이디어를 내놓았다 표면을 계산하는 클래스

    virtual void calculateSurface(); 
    

    이 정의하는 가상 메서드를 doable 접근 방식을 사용하여 내 문제를 해결하거나 그렇게 할 때 문제가 발생합니까?

  • 개체를 하나만 만들면 생성하는 것이 좋습니다.
+1

"switch (currentIndex()) {case 0 : GEO = new Geo_1 (휴식), case 1 : ..."또는 이와 비슷한 것이 어떨까요? 어쩌면 어떤 기능이 있습니까? 더 나은 솔루션은 콤보 상자의 컨텐트를 전환하는 것과 같을 수 있습니다. QString을 초과하므로 항목을 다른 순서로 배치해야하는 경우 여전히 수행해야합니다. 항목이 인식되지 않으면 오류가 발생합니다. 나는 내재적 인 의미없이 indizes에 찬성하지 않습니다. Btw, 대문자로 모두 로컬 변수를 명명하는 경우는 드뭅니다. – Aziuth

답변

1

질문 1 : 귀하의 솔루션은 아마 (단지 당신이 제공 한 정보를 기반으로) 잘 작동합니다.

질문 2 : 21 개 클래스 중 하나 또는 두 개만 사용하려는 경우 과장 될 가능성이 있습니다.

필요한 클래스 만 인스턴스화 할 수있는 솔루션을 찾아야합니다. Qt는 이것을 위해 사용할 수있는 메타 - 오브젝트 시스템을 제공합니다. 기본적으로 QMetaType class을 사용해야합니다.

먼저, "Geo_N"클래스를 Meta Object 시스템에 등록해야합니다. 당신은 그렇게 많은 솔루션을 가지고 있지만, 아마도 귀하의 경우 최고는 클래스 정의 후 선언적 매크로를 사용하는 것입니다 : 당신이 메타에서 클래스를 등록 할 경우

class Geo_1 { 
    Q_OBJECT 
    void Geo_1(); 
}; 
Q_DECLARE_METATYPE(Geo_1); 

그 Q_OBJECT 매크로는 필수입니다 유의하시기 바랍니다 개체 레지스트리.

그런 다음 동적으로 등록 된 유형의 인스턴스를 할 수있을 것입니다 :

// The index of selected class (between 1 and 21) 
int geoIndex = ui->cb_GRAN->currentIndex(); 

// Re-build the corresponding class name 
QString typeName = "Geo_" + QString::number(geoIndex); 

// Retrieve the type ID corresponding to the type name 
int typeId = QMetaType::type(typeName.toStdString().c_str()); 

// Instantiate the corresponding class 
Geometry* geo = (Geometry*) QMetaType::construct(typeId); 
+0

Antwane에게 답변 해 주셔서 감사합니다. 나는 그것을 시도했지만 마지막 줄에 오류가 발생한다. "create"는 QMetaType의 멤버가 아니다. – user3443063

+0

어떤 Qt 버전을 사용하고 있습니까? – Antwane

+0

Qt 4.8.4를 Qt 크리에이터 2.8.1과 함께 사용합니다. – user3443063

0

내 접근 방식은 당신의 형상

class GeoFactory{ 
    enum GeometryType { GEO_1, GEO_2, ...); 
    std::uique_ptr<Geometry> create(GeometryType type); 
} 

에 대한 팩토리 클래스를 정의한 다음에 GeometryType를 추가하는 것입니다 귀하의 데이터 역할의 콤보 상자 항목 현재 변경된 이벤트에서 현재 인덱스에서 GeometryType을 검색하고 해당 객체를 팩토리에서 요청합니다.

개인적으로 저는 항상 실제 비즈니스 로직에서 Qt를 지키려고 노력합니다. 저는 UI 용으로 만 사용합니다.