Можно ли вызывать функцию в списке инициализатора конструктора? - PullRequest
31 голосов
/ 12 ноября 2010

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

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 ]

36 голосов
/ 12 ноября 2010

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

23 голосов
/ 12 ноября 2010

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

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

1 голос
/ 12 ноября 2010

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

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

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

...