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

Мое чувство кишки это не так. Я нахожусь в следующей ситуации:

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 для его инициализации.

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

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

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

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

Другие вопросы по тегам