あなたが持っているものは大丈夫です。ただし、これを行わないように注意するように警告したいだけです:(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を使用して初期化されるため、一緒にバグが発生します。
メンバーは、クラス定義に表示される順序で初期化されることを常に覚えておいてください。そして、それらを初期化リストに入れる順序は関係ありません。