39

我的直觉是不是。我处于以下情况:

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构造的?

4

3 回答 3

41

这是完全正常和正常的。p_Builder在它之前被初始化。

于 2010-11-12T05:57:13.817 回答
33

你所拥有的很好。但是,我只是想警告您小心不要这样做:(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_Builder 之前声明了 p_Logger。其次,我使用成员 p_Builder 来初始化 p_Logger,而不是参数。

这些更改中的任何一个都可以,但是它们一起引入了一个错误,因为首先初始化了 p_Logger,并且您使用未初始化的 p_Builder 对其进行了初始化。

请始终记住,成员按照它们在类定义中出现的顺序进行初始化。并且您将它们放在初始化列表中的顺序无关紧要。

于 2010-11-12T06:26:38.600 回答
1

完美的好习惯。

我会建议这个(但它纯粹是个人层面的):

而不是在您的构造函数中调用函数,而是将它们分组到一个 init 函数中,仅出于灵活性目的:如果您以后必须创建其他构造函数。

于 2010-11-12T06:02:44.543 回答