То, что у вас есть, хорошо.Тем не менее, я просто хочу предупредить вас, чтобы вы были осторожны , чтобы не делать этого : (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чтобы инициализировать его.
Просто всегда помните, что члены инициализируются в порядке, в котором они появляются в определении класса.И порядок, в который вы помещаете их в список инициализации, не имеет значения.