1

私は常に新しいメンバーを追加するクラスを作成しています (これはプロジェクトのプロトタイプです)。独自のコンストラクター、コピー コンストラクター、コピー オペレーターなどを実装しました。メンバーを追加するときは、それらをコンストラクターとオペレーターに追加し続け、すべてを含めているかどうかを自動的に確認する方法があるかどうか疑問に思っています。

クラス宣言ですべてのメンバーをカウントし、その値で #define を設定するという簡単な解決策を実装しました。

Class A
{
   int a;
   int b;
   vector<int> c;
   /*3 members*/
}

#define CLASS_A_MEMBERS 3

コンストラクターでは、このようなことをするだけです

A::A( )
{
   int counter=0;
   a=1; counter++;
   b=1; counter++;
   c.clear(); counter++;

   assert(counter==CLASS_A_MEMBERS)
}

すごい!何かを追加するのを忘れるたびに、アサートと問題のある場所が表示されます!

わかりました、これは機能します...しかし、このようなことを行うよりエレガントな方法はありますか?

乾杯

4

2 に答える 2

3

この方法で根本的な問題を解決しないでください。代わりに、クラスをコピー不可にするか、簡単に (デフォルトで) コピー/割り当て可能にすることで解決します。すべてのリソースが RAII 原則によって管理されている場合、コンパイラにすべての特別なコンストラクタ/演算子を生成させるだけで、クラスに何をしても正しく生成されます。

于 2012-07-17T14:19:51.837 に答える
0

あなたが持っているコードでは、 を更新し、イニシャライザとコピー コンストラクタCLASS_A_MEMBERSに追加することを覚えておく必要があります。counter++

より優れた解決策は、単体テストを作成することです。これは、あらゆる種類の動作をテストするために使用できるため、はるかに強力な解決策です。

この問題を自動的に解決する方法はありません。クラスにメンバーを追加するときは、すべてのコンストラクターなどにアクセスして、それらが正しいことを確認する必要があります。テキスト検索は、最後のメンバーが言及されたすべての場所を見つけることができます。これは、新しいメンバーを追加するときに触れなければならない可能性のあるすべての場所を思い出すのに役立ちます。

于 2012-07-17T14:19:03.647 に答える