13 Stimmen

Behandlung einer Klasse mit einer langen Initialisierungsliste und mehreren Konstruktoren?

Ich habe ein (für mich) komplexes Objekt mit etwa 20 Datenelementen, von denen viele Zeiger auf andere Klassen sind. Für den Konstruktor habe ich also eine große, lange und komplexe Initialisierungsliste. Die Klasse hat außerdem ein Dutzend verschiedener Konstruktoren, die die verschiedenen Möglichkeiten widerspiegeln, wie die Klasse erstellt werden kann. Die meisten dieser initialisierten Elemente sind zwischen den verschiedenen Konstruktoren unverändert.

Meine Sorge dabei ist, dass ich jetzt einen großen Haufen kopierten (oder größtenteils kopierten) Codes habe, der, wenn ich der Klasse ein neues Mitglied hinzufügen muss, es möglicherweise nicht in jede der Konstruktorinitialisierungslisten schafft.

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

Dann wiederholen Sie die oben beschriebenen Schritte für die anderen Konstruktoren. Gibt es eine intelligente Art und Weise der Verwendung der Standard-Konstruktor für diese, dann ändern Sie die Ergebnisse für die anderen Konstruktoren?

0voto

John Dibling Punkte 96619

Brauchen Sie wirklich 5 verschiedene Konstrukteure?

Wenn Sie Konstruktoren konvertieren müssen, wollen Sie oft nicht auch einen Standardkonstruktor.

Ihre anderen Konstruktoren nehmen alle nur verschiedene Kombinationen der gleichen Sache. Es könnte eine bessere Idee sein, nur einen Konstruktor zu haben, der alle Parameter nimmt, mit einer Option für jeden Parameter, die den Wunsch anzeigt, eine Art von Standard für diesen Parameter aufzurufen.

Zum Beispiel:

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

};

0voto

BigSandwich Punkte 2668

Fügen Sie die Initialisierungsliste einfach in ein MACRO ein, und schon sind Sie fertig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X