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 に答える