私は(私のために)約20のデータメンバーを持つ複雑なオブジェクトを持っています。その多くは他のクラスへのポインタです。だから、コンストラクタのために、私は長い、複雑な初期化リストを持っています。クラスには、クラスが作成されるさまざまな方法を反映して、12の異なるコンストラクタもあります。これらの初期化された項目のほとんどは、これらの異なるコンストラクタのそれぞれの間で変更されません。長い初期化リストと複数のコンストラクタを持つクラスを扱う?
ここでは、新しいメンバーをクラスに追加する必要がある場合、各コンストラクタの初期化リストにコピーしないようにするために、コピーされた(またはほとんどコピーされた)コードが大量にあります。
class Object
{
Object();
Object(const string &Name);
Object (const string &Name, const string &path);
Object (const string &Name, const bool loadMetadata);
Object (const string &Name, const string &path, const bool loadMetadata);
}
Object::Object() :
name(),
parent_index (0),
rowData (new MemoryRow()),
objectFile(),
rows (new MemoryColumn (object_constants::RowName, OBJECTID, object_constants::ROWS_OID)),
cols (new MemoryColumn (object_constants::ColName, OBJECTID, object_constants::COLS_OID)),
objectName (new MemoryColumn(object_constants::ObjName, STRING, object_constants::short_name_len, object_constants::OBJECTNAME_OID)),
parent (new MemoryColumn(object_constants::ParentName, STRING, object_constants::long_name_len, object_constants::PARENT_OID)),
parentIndex (new MemoryColumn(object_constants::ParentIndex, OBJECTID, object_constants::PARENTINDEX_OID)),
childCount (new MemoryColumn (object_constants::ChildCount, INTEGER, object_constants::CHILD_COUNT_OID)),
childList (new MemoryColumn (object_constants::ChildList, STRING, object_constants::long_name_len, object_constants::CHILD_OID)),
columnNames (new MemoryColumn (object_constants::ColumnNames, STRING, object_constats::short_name_len, object_constants::COLUMN_NAME)),
columnTypes (new MemoryColumn (object_constants::ColumnTypes, INTEGER, object_constants::COLUMN_TYPE)),
columnSizes (new MemoryColumn (object_constants::ColumnSizes, INTEGER, object_constants::COLUMN_SIZE))
{}
次に、他のコンストラクタについて上記と同様に繰り返します。このためにデフォルトのコンストラクタを使用し、他のコンストラクタの結果を変更するスマートな方法はありますか?
は実装の詳細なのでプライベート継承を使用することができます。 –
または空の名前空間にベースクラスを入れますか? – jiggunjer