0

クラスの集約メンバーを初期化するルーチンを使用しています。

class MyClass
{
public:
    void Init()
    {
        double  array2D[10][10] = {0.0};
        bool    logicalarray[2] = {false};
    }

private:
    double  array2D[10][10];  
    bool    logicalarray[2]; 
};

int main()
{
    MyClass* myClassObject = new  MyClass();
    myClassObject->Init();

    delete myClassObject;
    return 0;
}

これに問題はありますか?コンパイル、ビルド、および実行は正常に行われます。デバッグ中に、各配列要素が Init() で定義したとおりに初期化されていることがわかります。ただし、コード クリーンアップ ツールは、Init() で名前付き変数が宣言されているが参照されていないと報告しています。

PS: C++11 はありません

4

1 に答える 1

1

コードクリーンアップツールは正しいです。このコードは、あなたが思っていることをしません:

void Init()
    {
        double  array2D[10][10] = {0.0};
        bool    logicalarray[2] = {false};
    }

このコードはのメンバー変数を初期化すると思います。MyClass実際に行うことは、2 つのローカル (自動) 変数を宣言し、それらを初期化してから返すことです。メンバー変数は変更されておらず、の本体内に隠されています。Init()

これは次の方法で修正できます。

void Init()
    {
        array2D[10][10] = {0.0};
        logicalarray[2] = {false};
    }

しかし、これは技術的には正しいが、それでも間違っていると私は主張します。いわゆる 2 段階構造を使用しています。2 つのフェーズは次のとおりです。 1) を構築しMyObjectます。2)関数MyObjectを呼び出して初期化しInit()ます。

醜い。汚い。エラーや物忘れが起こりやすい。コンストラクターがオブジェクトを完全に初期化された状態のままにしないため、意味的に正しくありません。原則として、2 段階の建設は絶対に避けるべきです。より良い方法は、オブジェクトのコンストラクターですべての初期化を実行することです。できればメンバー初期化リストで実行しますが、これは集約メンバーでは困難/不可能です。そのような場合、コンストラクターの本体で初期化します。

class MyClass
{
public:
  MyClass ()
  {
    array2D[10][10] = {0.0};
    logicalarray[2] = {false};
  }
  // ...
};

現在、 の構築は の初期化MyObject意味します。そして結局のところ、それがコンストラクターの目的です。代わりにそれを行います。MyObject

ここでの問題は、このように集計を初期化できないことです。構築時にこの構文を使用してのみ集約を初期化できますが、それは (存在しない) 初期化リストで発生しました。C++03 で初期化リストを使用して集計を初期化することはできません。したがって、醜い状況が残ります。

MyClass ()
{
  memset (logicalarray, logicalarray+2, 0);
  memset (array2D, array2D+sizeof (array2D), 0);
}

これは、そもそも生の配列を使用するのではなく、vector(または何か) を使用して、次のような方法で初期化するべきであるという議論につながります。

   class MyClass
    {
    public:
      std::vector <bool> mBools;
      std::vector <std::vector <double> > mDoubles;
      MyClass ()
      {
        std::fill_n (std::back_inserter (mBools), 2, false);
      }
    };

mDoublesの初期化は演習として残します。

于 2013-09-30T14:09:23.857 に答える