2013-06-28 4 views
14

В C++ существует ли способ иметь что-то вроде временной переменной в списке инициализации. Я хочу инициализировать два постоянных члена с одним и тем же экземпляром чего-либо, не передавая это что-то, удалить требование const, использовать Factory (то есть передать его, но фабрика сгенерировать его, чтобы скрыть его от пользователя API), или иметь temp на самом деле быть переменной-членом.Временные переменные C++ в списке инициализации

I.e. что-то вроде

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

В C++ 11 можно использовать делегирование конструкторов:

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++ 11 – imichaelmiers

+0

@imichaelmiers: Я вижу. У вас есть контроль над определением 'Something',' Foo' и 'Baz'? Например, вы могли бы добавить функцию-член в 'Foo', которая возвращает объект' Something', с которым он был построен? (чтобы вы могли использовать его при инициализации 'b' как' b (p, f.get_something()) ' –