Ответ 1
Это совершенно нормально и нормально. p_Builder
был инициализирован до него.
Чувство кишки - это не так. Я в следующей ситуации:
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
}
Или мне нужно изменить конструктор и передать a Logger* const
, из которого построено PluginLoader
?
Это совершенно нормально и нормально. 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 для его инициализации.
Всегда помните, что члены инициализируются в том порядке, в котором они отображаются в определении класса. И порядок, который вы помещаете в список инициализации, не имеет значения.
Совершенно хорошая практика.
Я бы предложил это (но это на чисто личном уровне):
вместо функций, вызываемых в вашем конструкторе, для группировки их в функции init, только для целей гибкости: если позже вам придется создавать другие конструкторы.