コードクリーンアップツールは正しいです。このコードは、あなたが思っていることをしません:
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
の初期化は演習として残します。