2013-06-28 14 views
14

W języku C++ istnieje jakiś sposób na umieszczenie czegoś na liście tymczasowej w liście inicjalizacji. Chcę zainicjować dwa stałe elementy z tą samą instancją czegoś, bez konieczności przekazywania tego, usuwać wymaganie const, używać Factory (tzn. Przekazywać je, ale mieć fabrykę, aby je ukryć przed użytkownikiem API), lub have temp jest zmienną składową.Zmienne tymczasowe C++ na liście inicjowania

tj. coś

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 
    } 
} 

zamiast

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

lub

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

Odpowiedz

18

w C++ 11 można użyć delegowania konstruktorów:

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

Nicea. Niestety, nie sądzę, że chcę, aby to zależało od C++ 11, tylko unikaj tego problemu. Jest to biblioteka i wyobrażam sobie, że niektórzy ludzie mogą sprzeciwić się jej integracji, gdyby musieli zacząć używać C++ 11 – imichaelmiers

+0

@imichaelmiers: Rozumiem. Czy masz kontrolę nad definicją 'Something',' Foo' i 'Baz'? Na przykład, czy mógłbyś dodać funkcję członka do 'Foo', który zwraca obiekt' Something', z którym został skonstruowany? (abyś mógł go użyć w inicjalizacji 'b' jako' b (p, f.get_something()) ' –