2016-07-01 3 views
-1

나는 다음과 같은 응용 프로그램 논리를 가지고 있다고 가정하자? 현재 내가하고있는 일은C++ 계층 클래스 상속 설계

struct BConfig 
{ 
    int a; 
    int b; 
}; 

struct ConfigA:public BConfig 
{ 
    int c; 
}; 
struct ConfigB:public BConfig 
{ 
    int d; 
}; 
struct Config 
{ 
    ConfigA getConfigA(); 
    ConfigB getConfigB(); 
    int a; 
    int b; 
    int c; 
    int d; 
}; 

내가 더 좋은 방법이라고 생각합니다. 어떠한 제안?

+1

무엇이'cond1'과'cond2'입니까? 'classA'와'classB' 클래스를 만들었습니까? 그 (것)들을 누설하게하십시오 좋은 선택 같이 소리가 나지 말라. – skypjack

+0

그것은 불완전한 부호이다. 일부 설정 브랜치가 있음을 의미합니다. 분기는 ConfigA 내에서 계속 될 수 있습니다. – Alfred

+0

[mvce] (http://stackoverflow.com/help/mcve)를 제공하십시오. – skypjack

답변

1

이것은 XY 문제와 같습니다. 당신은 당신이 원래의 문제에 대한 해답이 될 수도 있고 그렇지 않을 수도있는 일을하려는 특정 해법을 가지고 있습니다. 또한 예에서 new의 사용이 불완전한 경우 Class 개체를 해제하는시기와 방법이 명확하지 않습니다.

struct IConfig { 
    // TODO: identification as to which class instance this is. 
    // and/or virtual methods 
    int a; 
    int b; 
    virtual ~IConfig(){} 
}; 

struct ConfigA : public IConfig { 
    int c; 
    virtual ~ConfigA(){} 
}; 

struct ConfigB : public IConfig { 
    int d; 
    virtual ~ConfigB(){} 
}; 

class IClass { 
    // TODO: identification as to which class instance this is. 
    // and/or virtual methods 
    virtual ~IClass(){} 
}; 

class ClassA : public IClass { 
    public: 
    ClassA(const IConfig & iconf) { 
     ConfigA & aconf = dynamic_cast<ConfigA&>(iconf); 
    } 
    virtual ~ClassA(){} 
}; 

class ClassB : public IClass { 
    public: 
    ClassB(const IConfig & iconf) { 
     ConfigB & bconf = dynamic_cast<ConfigB&>(iconf); 
    } 
    virtual ~ClassB(){} 
}; 

class App { 
    IConfig * config; // in case 
    IClass * cls; 
    void initial(IConfig config){ 
     if(cond1) 
     cls = new ClassA(config); 
     else if(cond2) 
     cls = new ClassB(config); 
     else 
     // ... 
    } 
}; 

그냥 cond1가 전달되는 IIF IConfig 사실 일 것 같은 솔루션을해야합니다 : (여전히 작업이 필요하지만 그것은 시작이다) 같은 것을 - 인터페이스 패턴을 사용하는 것이 좋습니다 말했다

initial은 생성되는 클래스와 일치하는 ConfigA입니다. 인터페이스 자체에 문제가 없는지 확인하기 위해 더 많은 검사를 추가 할 수 있습니다. 상수를 반환하는 가상 메소드는 충분히 좋지만 실제로는 이미 지저분한 접근처럼 보이기 때문에이 작업을 수행 할 때 수행하려는 작업에 따라 달라집니다. 등을 차례로 구성 클래스를 사용해야 결정하는

군더더기를로드 할 클래스 - - 당신이 경우에 할 수 있습니다

예는 아마도 IConfig의 로컬 설정은 모두 결정하는 데 사용할 수 있습니다 각 ClassIConfig의 자체 구현이 있으므로 App (IConfig 데이터 사용)을 통해 만들 클래스를 결정할 수 있습니다. 다시 말하지만, 당신이이 구조로 달성하고자하는 것을 알지 못하면 (다른 것과는 반대로) 아무도 확실히 말할 수 없습니다.

+0

감사합니다. 당신의 해결책은 내가 지금 얻을 수있는 최선입니다. 내 응용 프로그램에는 동적 파생 클래스가 포함될 수 있으므로 다른 클래스에는 다른 구성이 있습니다. 전체 App 구성은 단일 파일로 지정됩니다. 이 경우에 적합한 구성 인터페이스에 대한 디자인 패턴을 찾으려고했습니다. – Alfred