2012-01-01 2 views
7

클래스에 A 클래스의 멤버가 있는데, 생성자는 여러 매개 변수를 사용합니다. Im 클래스 내 생성자의 매개 변수를 클래스 A의 생성자에 전달합니다. 그러나이 매개 변수가 중요하므로 A의 멤버를 확인하기 전에 해당 매개 변수를 확인해야합니다. 그리고 문제를 heres : 멤버 초기화 목록을 생성하여 효과적으로 기본 생성자를 호출합니다. 생성자의 검사가 끝나면 A의 생성자를 호출하여 부수적으로 호출 할 수 있습니다. 그러나 A의 소멸자는 비공개이므로 오류가 발생합니다.초기화 목록 전에 검사를 실행하십시오.

어떻게 해결할 수 있습니까?

MyClass::MyClass(int someParam) : otherMember(2){ 
//checks for someParam 
member = A(someParam); // <- produces error 
} 
+0

클래스 A의 작성자와 이야기하고 잘못된 매개 변수 값이 발생할 경우 A 클래스의 생성자를 현명하게 작동하도록 그녀를 강요합니다. –

+0

'A'를 구성한 다음 사실을 확인해도됩니까? – Cameron

+0

실제로 Java에서 허용 할 수 있도록 Sun을 설득하려고했지만 거부했습니다. 하나의 생성자를 다른 생성자로 호출 할 수 있기 때문에 Java에서 속임수를 사용하는 것이 약간 쉽습니다. – Neil

답변

9

당신이 무슨 일을하든 액세스 가능한 소멸자가 필요할 것입니다. 그러나 질문을 해결하기 위해, 하나의 옵션이 초기화 내에서 매개 변수를 확인하기 위해 정적 함수를 호출하는 것이다 다음 , 쉼표 연산자가 아닌 인수 분리기가 사용되는

class MyClass { 
    private: 
    static void checkParam(int); 
// ... 
}; 

MyClass::MyClass(int someParam) : otherMember((checkParam(someParam), 2)) { 
    // ... 
} 

static void MyClass::checkParam(int someParam) { 
    if (...) throw someException(); 
} 

주 -이 모두 왼쪽으로 평가 오른쪽 표현을 사용하고 왼쪽의 결과를 버립니다.

+0

checkParam()에서 throw 된 예외가 여전히 프로그램 흐름을 방해합니까? 이 질문에 대한 대답이 '예'라면, 이것이 내가 필요한 것입니다. 개인 소멸자에 대해 궁금해하는 사람들을 위해, 그것의 참조는 반대표를 던졌습니다. 나는 적절한 참조 계산 포인터를 사용하여 게스가 더 좋을 것입니다. – Paranaix

+0

예. checkParam은'2' 전에 평가 될 것이므로 throw하면 '2'는 평가되지 않으므로 otherMember 생성자를 호출 할 수 없습니다 – bdonlan

0

나는이 접근의 두 가지 방법을 참조하십시오

  1. 확인 클래스 A이 매개 변수가없는 생성자를 사용하고, 별도의 방법에 someParam을 설정할 수 있습니다 확인하십시오에서 A.SetSomeParam(someParam)

  2. 상속하지 A이 아니라, A 유형의 구성원 객체를 보유하고 원하는 경우 언제든지 구성 할 수 있습니다.

관련 문제