2013-06-28 2 views
14

C++에서 초기화 목록에 임시 변수와 같은 것을 넣을 수있는 방법이 있습니까? 뭔가를 전달하거나, const 요구 사항을 제거하거나, 팩토리를 사용하지 않고 (즉, 전달하지만 공장에서 생성하여 API 사용자로부터 숨길 수 있음), 동일한 인스턴스로 두 개의 상수 멤버를 초기화하려고합니다. 임시 변수를 실제로 멤버 변수로 지정하십시오.초기화 목록의 C++ 임시 변수

e.e. C++ 11에서

Class Baz{ 
    const Foo f; 
    const Bar b; 
    Baz(Paramaters p):temp(p),f(p,temp),b(p,temp){ //temp is an instance of Something 
                // But NOT A member of Baz 
    // Whatever 
    } 
} 

대신

Class Baz{ 
    Foo f; 
    Bar b; 
    Baz(Paramaters p){ 
     Something temp(p); 
     f = Foo(p,temp) 
     b = Bar(p,temp) 
    } 
} 

또는

Class Baz{ 
    Foo f; 
    Bar b; 
    Baz(Paramaters p,Something s):f(p,s),b(p,s){ 
    } 
} 

답변

18

같은 당신은 생성자를 위임 사용할 수 있습니다

class Baz{ 
    const Foo f; 
    const Bar b; 
    Baz(Paramaters p) : Baz(p, temp(p)) { } // Delegates to a private constructor 
              // that also accepts a Something 
private: 
    Baz(Paramaters p, Something const& temp): f(p,temp), b(p,temp) { 
     // Whatever 
    } 
}; 
+0

니스. 불행히도, 나는 이것이 C++ 11에 의존하도록 만들고 싶지 않습니다. 단지이 문제를 피하십시오. 그것의 라이브러리와 나는 사람들이 C++을 사용하기 시작해야한다면 그것을 통합하는 것에 반대 할지도 모른다는 것을 상상할 것입니다. – imichaelmiers

+0

@imichaelmiers : 알겠습니다. 'Something','Foo','Baz'의 정의를 제어 할 수 있습니까? 예를 들어, 생성 된'Something' 객체를 반환하는'Foo'에 멤버 함수를 추가 할 수 있습니까? (그래서'b '를'b (p, f.get_something())'로 초기화 할 때 사용할 수있다. –