2015-11-13 4 views
9

Ich habe eine Frage, die Art von ein bis dieses Follow-up ist:Wie wird die Initialisierung von struct beibehalten, wenn Mitglieder hinzugefügt werden?

Initializing default values in a struct

ich eine Struktur haben, der bereits 17 bools bekam, und eine clear() Methode, um sie alle zu false setzt. Es ist ein langfristiges Projekt; Der Code könnte noch Jahre in Gebrauch sein und hinzugefügt werden. Gibt es eine Möglichkeit, alle Member zu initialisieren, die automatisch erweitert werden, so dass jemand, der der Struktur neue Mitglieder hinzufügt, nicht daran denken muss, sie der clear() Methode hinzuzufügen (außer einem Kommentar, der "bitte nicht vergessen")?

Diese Codebasis ist zu dieser Zeit nicht C++ 11, also glaube ich nicht, dass ich in der Deklaration initialisieren kann.

Der Code ist wie folgt:

typedef struct { 
    bool doThingA; 
    bool doThingB; 
    bool doThingC; 
    bool doThingD; 
    // etc for several more bools 

    void clear() { 
     doThingA = false; 
     doThingB = false; 
     doThingC = false; 
     doThingD = false; 
     // etc... 
    } 
} EnableFlags; 
+12

Finden Sie die Person, die Ihnen beigebracht hat, 'typedef struct' zu sagen, löschen Sie ihre Telefonnummer, unfriend sie auf Facebook und bewegen Sie mindestens zwei Städte weg von ihnen. –

+4

Warum haben Sie nicht 'array' /' vector' oder 'bitset'? – Jarod42

+2

Sie können stattdessen ein 'std :: array' verwenden, da es eine feste Größe hat und Sie die Größe automatisch in' clear' kennen. –

Antwort

9
struct EnableFlags { 
    bool doThingA; 
    bool doThingB; 
    bool doThingC; 
    bool doThingD; 
    // etc for several more bools 

    void clear() { 
     *this = EnableFlags(); 
    } 
}; 

schaffen wird dies eine vorübergehende mit allen Mitgliedern auf Null gesetzt und dann *this eine Kopie davon machen. Also setzt es alle Mitglieder auf Null, egal wie viele es sind.

Dies setzt voraus, dass Sie keinen Standardkonstruktor definiert haben, der etwas anderes tut, als alle Flags auf false zu setzen. Wenn Sie keine benutzerdefinierten Konstruktoren haben, gilt diese Annahme.

C 11 Seit ++ ist es noch einfacher:

void clear() { 
    *this = {}; 
} 
+2

'* this = {};' ist gefährlich, als hätte die Klasse einen Zuweisungsoperator, der 'int' nimmt, dann wird dies dem Kopierzuweisungsoperator vorgezogen. [Siehe hier für das vollständige Beispiel] (http://stackoverflow.com/questions/33511641/overload-resolution-assignment-of-empty-brace) –

+1

auch, '* this = EnableFlags();' tut Standard-Initialisierung in C++ 98, aber Wert-Initialisierung in C++ 03. Ich erwähne das für den Fall, dass OP C++ 98 verwendet (zum Beispiel 32-Bit Borland/Embarcadero Compiler) –

+1

Wer C++ 98 anstelle von C++ 03 verwendet, verdient, was auch immer sie bekommen. Es ist 2015, wenn dein Compiler fast alt genug ist, um legal Alkohol zu trinken, dann hast du ein Problem, das durch Ändern des Compilers gelöst werden sollte, nicht durch Kompromittieren deines Codes. –

2

Eine Option ist innerhalb der clear Funktion eine statische Aussage über die Größe der Struktur zu verwenden.

Zuerst ermitteln Sie die aktuelle Größe der Struktur. Sagen wir, es ist 68. Dann fügen Sie diese:

void clear() 
{ 
    BOOST_STATIC_ASSERT(sizeof(EnableFlags) == 68 && "You seem to have added a data member. Clear it before changing the number 68 to match current struct size!!"); 

    // the rest as before ... 
} 

ich Makro statische Behauptung Erhöhung der verwendet haben, aber Sie können jede andere verwenden Sie wollen, oder rollen Sie Ihre eigenen.

Mit einer solchen Zusicherung wird der Code nicht kompiliert, wenn sich die Größe der Struktur ändert. Es ist keine Catch-All-Lösung, aber bietet eine Sicherheit.

+0

Was ist der Punkt von booleschen UND mit einem String-Literal? –

+0

@ M.M Eine Nachricht in den auszudrückenden Ausdruck schmuggeln. Es kann dann ein Teil der Fehlermeldung des Compilers werden. – Angew

1

Verwenden Sie einfach objetcs.

Sie können also eine 'for' Schleife verwenden, um einen std :: Vektor einzutragen, wenn ihre Werte falsch oder wahr sind.

So haben Sie nicht Ihre Futurs-Mitarbeiter setzen den "false" -Wert jedes Mal, wenn sie eine neue boolesche Variable erstellen.

Strukturen sind hier ungeeignet.

+0

Das scheint keinen Sinn zu ergeben. Instanzen von Strukturen sind Objekte –

+0

Ich meinte Klasse und all die POO-Sache. – Madz

Verwandte Themen