2012-08-07 2 views
0

나는이 트릭으로 파생 된 기본 클래스를 제거하고 다시 만들 수 있습니까?런타임 선택베이스 -ctor로 복사 불가능한 기본 클래스를 초기화하는 방법

class base: noncopyable 
{ 
    base();   //ctor with none param 
    base(int x); //ctor with one param 
    base(int x, int y); //ctor with two param 

    virtual ~base(); 
} 

struct params 
{ 
    int x; 
    int y; 
    enum 
    { 
     typeNoneParam, //neither x nor y is defined 
     typeOneParam, //only x is defined 
     typeTwoParam //x and y both are defined 
    }typeParam; 
} 

class Derived 
{ 
    Derived(params p); //construct base class conditionally by p.typeParam 
} 

Derived::Derived(params p) 
    :base() //default typeNoneParam 
{ 
    //typeNoneParam need not do special process 

    if (p.typeParam == params::typeOneParam) 
    { 
     base::~base(); //delete the default-typeNoneParam creation by base-dtor 
     base(p.x);  //recreate the new base with one-param base-ctor 
    } 
    if (p.typeParam == params::typeOneParam) 
    { 
     base::~base(); //delete the default-typeNoneParam creation by base-dtor 
     base(p.x, p.y); //recreate the new base with two-param base-ctor 
    } 
} 

클래스 파생 및 기본 cannnot에 대한 모든 선언은 변경할 수 없으며 struct params도 cannnot입니다.

파생 클래스의 구현 만 변경 허용됩니다.

누구나 아이디어를 줄 수 있습니까? 그리고 다른 모든 더 부드러운 구현은이 시나리오를 만족시킵니다 (동적으로 선택하는 기본 ctor로 초기화 불가능한 기본 클래스).

+0

게시 된 코드는'Derived '의 초기화 목록에서'base' 생성자를 호출 할 때 컴파일되지 않지만'Derived'는 실제로'base'를 상속받지 않으며'base '유형의 멤버 변수도 포함하지 않습니다 '. –

답변

0

파생 클래스 생성자는 먼저 생성되는 유효한 Base 클래스 개체에 따라 다릅니다. Base 클래스를 파기 함으로서 당신은 정의되지 않은 행동을하고 있습니다. 예를 들어 가상 함수를 통해이를 알 수 있습니다. 파생 클래스가 초기화 목록의 일부로서 기본 클래스 생성자에 매개 변수를 전달하는

이 작업을 수행하는 적절한 방법은 다음과 같습니다

Derived(params p) : base(p) {}; 
+0

예.하지만 기본 클래스를 변경할 수 없으면 어떻게해야합니까? – user1580722

+1

@ user1580722 그러면 'Derived'를 변경하여 적절한 기본 생성자를 선택할 수 있도록 단일 'params'이상을 필요로합니다. C++이 제공하는 것보다 더 많은 유연성을 요구하고 있습니다. –

+0

그리고 정의되지 않은 동작에 대해 더 많은 단서를 줄 수 있습니까? 어떤 트릭이 더러운 정의되지 않은 동작을 무시할 수 있습니까? – user1580722

1

나는이 경우 I가 정적 공장 기능을 추가하여 파생 클래스 (선택적으로 생성자를 보호). typeParam에 스위치를 놓고 올바른 생성자로 개체를 만들 수 있습니다. 파생 클래스에는 각 열거 형 항목마다 하나씩 세 개의 생성자가 있어야합니다.

해킹없이 적절한 동작을 제공합니다.

관련 문제