Можно ли вызывать функцию в списке инициализатора конструктора?
Мое чувство кишки это не так. Я нахожусь в следующей ситуации:
class PluginLoader
{
public:
Builder* const p_Builder;
Logger* const p_Logger;
//Others
};
PluginLoader::PluginLoader(Builder* const pBuilder)
:p_Builder(pBuilder), p_Logger(pBuilder->GetLogger())
{
//Stuff
}
Или я должен изменить конструктор и передать Logger* const
отсюда PluginLoader
построен?
3 ответа
Это совершенно нормально и нормально. p_Builder
был инициализирован до этого.
То, что у вас есть, хорошо. Тем не менее, я просто хочу предупредить вас, чтобы быть осторожным, чтобы не делать этого: (GMan упомянул об этом, я просто хотел сделать это совершенно ясно)
class PluginLoader
{
public:
Logger* const p_Logger; // p_Logger is listed first before p_Builder
Builder* const p_Builder;
//Others
};
PluginLoader::PluginLoader(Builder* const pBuilder)
:p_Builder(pBuilder),
p_Logger(p_Builder->GetLogger()) // Though listed 2nd, it is called first.
// This wouldn't be a problem if pBuilder
// was used instead of p_Builder
{
//Stuff
}
Обратите внимание, что я сделал 2 изменения в вашем коде. Во-первых, в определении класса я объявил p_Logger перед p_Builder. Во-вторых, я использовал элемент p_Builder для инициализации p_Logger вместо параметра.
Любое из этих изменений было бы хорошо, но вместе они привносят ошибку, потому что p_Logger инициализируется первым, и вы используете неинициализированный p_Builder для его инициализации.
Просто всегда помните, что члены инициализируются в порядке их появления в определении класса. И порядок их размещения в списке инициализации не имеет значения.
Совершенно хорошая практика.
Я хотел бы предложить это (но это на чисто личном уровне):
вместо того, чтобы вызывать функции в вашем конструкторе, группировать их в функцию инициализации, только для целей гибкости: если позже вам придется создавать другие конструкторы.