Вы должны стремиться инициализировать свой элемент данных, а не назначать их в теле конструктора. Обе версии, которые вы показывали, вызывают создание по умолчанию экземпляра std::vector<std::string>
и присваиваются ему позже. Следовательно, я бы предложил это:
A::A(bool someFlag, const Params& someParams) :
texts(someFlag ? createSomeTexts(someParams) : createOtherTexts(someParams))
{}
или, что более читабельно, пусть createSomeTexts
также обрабатывает флаг:
A::A(bool someFlag, const Params& someParams) :
texts(createSomeTexts(someFlag, someParams))
{}
Сделайте createSomeTexts
функцией-членом, если ей нужен доступ к другим элементам данных (убедитесь, что они объявлены перед элементом texts
и правильно инициализированы - как указывал @Scheff, это вряд ли будет хорошей идеей, хоть). В противном случае сделайте его свободной функцией (см. здесь , почему это предпочтительнее). Если createSomeTexts
является свободной функцией, вы можете с таким же успехом построить объект следующим образом:
std::vector<std::string> stringsToInject = createSomeText(/* Some flags.... */);
A instance(stringsToInject); // A's ctor updated to make this work
, который может еще больше разделить проблемы, так как конструктор A
заботится об инициализации элементов данных, тогда как логика для создания данных инициализации находится где-то еще.