Обработка класса с длинным списком инициализации и несколькими конструкторами? - PullRequest
12 голосов
/ 17 апреля 2009

У меня есть (для меня) сложный объект с примерно 20 членами данных, многие из которых являются указателями на другие классы. Так что для конструктора у меня большой длинный сложный список инициализации. Класс также имеет дюжину различных конструкторов, отражающих различные способы создания класса. Большинство этих инициализированных элементов неизменны между каждым из этих различных конструкторов.

Меня беспокоит то, что теперь у меня есть большой кусок скопированного (или преимущественно скопированного) кода, который, если мне нужно добавить новый член в класс, может не попасть в каждый из списков инициализации конструктора.

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))
{}

Затем повторите, как указано выше, для других конструкторов. Есть ли какой-нибудь разумный способ использовать конструктор по умолчанию для этого, а затем изменить результаты для других конструкторов?

Ответы [ 12 ]

0 голосов
/ 18 апреля 2009

Просто поместите список инициализатора в MACRO и покончите с этим.

0 голосов
/ 18 апреля 2009

Вам действительно нужно 5 разных конструкторов?

Очень часто, если вам нужно преобразовать конструкторы, вам также не нужен конструктор по умолчанию.

Все остальные ваши конструкторы используют разные комбинации одного и того же. Возможно, было бы лучше иметь только один конструктор, который принимает все параметры, с опцией для каждого параметра, которая указывает на желание вызвать какое-то значение по умолчанию для этого параметра.

Например:

class Object
{
  Object (const string *Name, // can be NULL
    const string *path, // can be NULL 
    const bool loadMetadata);

};
...