Ho un oggetto (per me) complesso con circa 20 membri dati, molti dei quali puntano ad altre classi. Quindi, per il costruttore, ho una lunga e complessa lista di inizializzazione. La classe ha anche una dozzina di diversi costruttori, che riflettono i vari modi in cui la classe può essere creata. La maggior parte di questi articoli inizializzati sono invariati tra ciascuno di questi diversi costruttori.Gestione di una classe con un lungo elenco di inizializzazione e più costruttori?
La mia preoccupazione è che ora ho un grosso pezzo di codice copiato (o per lo più copiato) che, se ho bisogno di aggiungere un nuovo membro alla classe, non può farlo in ciascuno degli elenchi di inizializzazione del costruttore.
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))
{}
Quindi ripetere come sopra per gli altri costruttori. C'è un modo intelligente di utilizzare il costruttore predefinito per questo, quindi modificare i risultati per gli altri costruttori?
potrebbe voler utilizzare l'ereditarietà privata perché questo è un dettaglio di implementazione. –
o mettere la baseclass in uno spazio dei nomi vuoto? – jiggunjer