2017-10-14 14 views
0

파생 클래스가있는 기본 클래스가있는 경우 단일 생성자에 전달 된 인수에 따라 저음 또는 파생 클래스로 인스턴스를 만들 수 있습니까?C++은 단일 생성자에 주어진 인수에 따라 저음 클래스 대신 파생 클래스를 만들 수 있습니까?

예 코드 : 위에서 나타낸 바와 같이,이 클래스의 인스턴스가 생성 될 때

//Base Class 
class MyClass { 
public: 
    //All instances created with this constructor 
    MyClass(int param1, int param2) { 
    if (param1 > param2) { //(for example) 
     // TODO - create this object as SubClass instead 
    } else { 
     //normal base class construction 
    } 
    } 
} 

//Derived Class 
class SubClass { 
public: 
    SubClass(int param1, int param2) { 
    //Subclass construction 
    } 

    void function() { 
    //function that only works on subclass objects 
    } 
} 

MyClass object1(1, 2); //should create MyClass object 
MyClass object2(2, 1); //should create SubClass object 

는, I는 어느 기능 생성자를 정상적으로 원하는 클래스를 만들거나, (인수로서 주어진 값에 따라) 파생 된 SubClass의 인스턴스로 만듭니다. 매개 변수의 유형뿐만 아니라 다른 매개 변수의 값을 기반으로해야합니다. 이것을 할 수 있습니까? 필요한 경우 하나의 생성자 만 사용해야하는 경우 순수 기본 클래스를 사용하는 대신 '일반'옵션을 나타내는 다른 파생 클래스가 있어야합니다. 이것이 가능하지 않다면 나는 하나 하나가 생성 될 때마다 생성되어야하는 확인해야 할 것 같은

, 오히려 나는이의 인스턴스를 할 때 나는 단지 하위 클래스 생성자를 호출 할 수 있습니다, 그러나 이것은 좋지 않은 생성자 내에서 단일 내부 검사 만하는 것보다

+2

이 공장 디자인 패턴이 생성 공장에 매개 변수를 전달을 위해 무엇이며, 반환하거나 MyClass에 또는 매개 변수에 따라 서브 클래스를 작성하십시오. – mnistic

답변

1

당신은 MyClass의 정적 함수로 생성을 위임 할 수 있습니다 참조 :

class SubClass; 

//Base Class 
class MyClass { 
    MyClass(int param1, int param2) { 
    } 
public: 
    static unique_ptr<MyClass> Create(int param1, int param2) { 
    if (param1 > param2) { //(for example) 
     return std::make_unique<SubClass>(param,param2); 
    } else { 
     return std::make_unique<MyClass>(param,param2); 
    } 
    } 
} 

//Derived Class 
class SubClass : public MyClass { 
    SubClass(int param1, int param2) { 
    //Subclass construction 
    } 
public: 

    void function() { 
    //function that only works on subclass objects 
    } 
} 

std::unique_ptr<MyClass> object1 = MyClass::Create(1, 2); //should create MyClass object 
std::unique_ptr<MyClass> object1 = MyClass::Create(2, 1); //should create SubClass object 
+0

좋아요! 구성을 정적 메서드로 기본 설정하는 방법이 있습니까? 가정하지 않으면, 정적 메서드를 사용하지 않는 한 생성자가 호출 될 때마다 예외를 throw 할 수 있습니까? – ZSmith