多くのクラス メンバーとさまざまなコンストラクターを持つこのクラスがあります。
これまでは、所有している各コンストラクターでコンストラクター初期化リストを使用し、各メンバーを希望どおりに調整していました。
クラスに新しいメンバーを追加するたびに、各コンストラクターにアクセスし、初期化リストを更新してこのメンバーにデフォルト値を追加する必要があるため、これは非常に面倒です。
そこで、必要な値を初期化するメソッドを追加しようと考えました。問題!メソッドは初期化リストの後に実行されるため、この初期化リストに入力した特定の値はメソッドによってオーバーライドされます。
簡単な例:
class A
{
public:
A();
A( B b );
A( int i );
// A( .... ); plenty of them
private:
int member1, m2, m3,m4;
bool b1,b2, b3;
// ....
// every time I add a member I have to modify the initialization lists
// solution: agregate member initialization in a member function:
void init_members();
}
// init list constructors
A::A() : m1(false), m2(false), m3(false), m4(true) .... // looong list
{
}
A::A( B b) : m1(b.state()), m2(false), m3(false), ... // loong list
{
}
// problem, if I use init_members:
void A::init_members()
{
m1 = false;
m2 = false;
m3 = false;
// ...
}
A::A( int i ) : m1( true)
{
init_members(); // overrides m1 !!!
}
それで、私の質問:リスト初期化子とメソッド初期化子を混在させて、リスト初期化子がメソッド初期化子よりも優先されるようにすることはできますか? 上記の例では、m1 を最後のコンストラクター
にとどめたいと考えています。true
注:メソッド呼び出しの後に初期化リストを移動できることはわかっていますが、これは値を members に 2 回割り当てることを意味しinit_members()
ます。最適ではありません:-)
在庫があれば、ちょっとしたトリックを期待していました。