Fragen zu | und Serialisierung



  • Hi.
    Ich hab 2 Fragen an die werte Community:

    #1
    Wenn ich 2 Werte mit | verbinde, wie als bsp.

    MB_ICONERROR | MB_OK
    

    wie bekomme ich die wieder auseinander und was muss ich beim Vergeben der Werte an die einzelnen #defines beachten?
    Ich hab das in meinem Buch nicht verstanden 😞 und über google nix gefunden.

    #2
    Wie speicher ich meine Klassen?
    An sich das speichern mit einem outstream ist mir klar, wie std::ofwstream und in den Klassen am besten den <<-operator definieren.
    Aber woher weiss ich dann später, welche Werte in der Datei zu welchen Klassen gehören? Einfach in der Reihenfolge speichern wie laden? Oder gibts da bessere Methoden?

    Für Antworten immer dankbar.
    lg



  • Zu #1:
    Du kannst mit dem &-Operator prüfen, ob ein Wert gesetzt wurde:

    if (var & MB_OK) cout << "MB_OK ist gesetzt" << endl
    

    die werte müssen soweit ich weiß immer potenzen von 2 sein, also 2, 4, 8, 16, 32 etc.



  • Du kannst dir XML oder ein ähnliches Format aussuchen und dann die Klassen so speicher

    <class>
       <name>foo</name>
       <members>
          <var1>13</var1>
    ...
    

  • Administrator

    Zu #1,
    Am besten suchst du nach Flags, dann solltest du Infos finden. Das Prinzip ist eigentlich ganz einfach. Man setzt einfach Bits in einer Zahl und sieht dieses Bit als Ein-/Ausschalter für irgendetwas. Über Bitoperationen kann man diese Bits setzen, bzw. abrufen. Mal ein Beispiel in Pseudo-Code:

    FLAG_ONE := 0x01 = 0000 0001 = 1
    FLAG_TWO := 0x02 = 0000 0010 = 2
    
    FLAG_COM := FLAG_ONE | FLAT_TWO
             := 0x03 = 0000 0011 = 3
    
    FLAG_COM & FLAG_TWO
             := 0x02 = 0000 0010 = 2
    
    FLAG_ONE & FLAG_TWO
             := 0x00 = 0000 0000 = 0
    
    usw.
    

    Bitoperationen wären also durchaus auch noch ein Stichwort.

    Im übrigen möchte ich darauf hinweisen, dass du keine #define als Konstanten missbrauchen solltest! Das ist ein ganz übler Stil und führt zu Fehlern! Nimm lieber richtig Compiler-Konstanten:

    // z.B:
    int const KONSTANTE = 200;
    

    Zu #2,
    Du kann sie einfach in einer Reihenfolge abspeichern. Du kannst auch Metadaten einführen, ähnlich wie bei XML oder auch anders. Es gibt da eine riesige Auswahl an Möglichkeiten, da kannst du eigentlich alles mögliche machen.

    Grüssli


Anmelden zum Antworten