你所拥有的很好。但是,我只是想警告您小心不要这样做:(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 对其进行了初始化。
请始终记住,成员按照它们在类定义中出现的顺序进行初始化。并且您将它们放在初始化列表中的顺序无关紧要。