我的直觉是不是。我遇到以下情况:
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
吗?
答案 0 :(得分:36)
这完全正常和正常。 p_Builder
已在其之前初始化。
答案 1 :(得分:22)
你有什么好。但是,我只是想警告你要小心不要这样做 :( 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来初始化它。
请记住,成员按照它们在类定义中出现的顺序进行初始化。你把它们放在初始化列表中的顺序是无关紧要的。
答案 2 :(得分:1)
非常好的练习。
我会建议(但纯粹是个人的):
而不是在构造函数中调用函数,将它们分组到init函数中,仅用于灵活性目的:如果以后必须创建其他构造函数。