Подтвердить что ты не робот

Можно ли вызвать функцию в списке инициализаторов конструктора?

Чувство кишки - это не так. Я в следующей ситуации:

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?

4b9b3361

Ответ 1

Это совершенно нормально и нормально. p_Builder был инициализирован до него.

Ответ 2

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

Всегда помните, что члены инициализируются в том порядке, в котором они отображаются в определении класса. И порядок, который вы помещаете в список инициализации, не имеет значения.

Ответ 3

Совершенно хорошая практика.

Я бы предложил это (но это на чисто личном уровне):

вместо функций, вызываемых в вашем конструкторе, для группировки их в функции init, только для целей гибкости: если позже вам придется создавать другие конструкторы.