Klasse definieren nach XML-Input und Variablen intialisieren



  • Hallo zusammen,

    ich habe 2 Fragen zu einer C++ Klasse (und hoffe, es ist in Ordnung in diesem Forum, diese in einem Thread zu stellen 🙂 ):

    1. Ich möchte in einer Klasse Variablen definieren in Abhängigkeit zu einem Input aus einer XML-Datei.
    2. Alle Variablen sollen beim Instanzieren von Objekten der Klasse auf 0 (oder einen anderen int-Wert gesetzt werden).

    Beispiel:
    XML-Datei liefert einen vector von Strings, sagen wir "Wasser", "Feuer", "Erde".

    Ziel wäre dann eine Klasse wie:

    class Elemente {
      int Wasser = 0;
      int Feuer = 0;
      int Erde = 0;
    }
    

    zu 1) Ist es möglich, Klassen bei ihrer Definition abhängig von Elementen zu machen, die erst zur Laufzeit bekannt werden (hier: XML-Input)?
    zu 2) MSVS2010 liefert mir bei der obigen Form [int VarName = 0;] einen Fehler: error C2864: "Elemente::Wasser": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden. Kann ich irgendwie anders Default-Werte setzen?

    Frage: Geht das? Wie gehe ich hier vor?

    Viele Grüße!
    - Corak


  • Mod

    Dir ist schon klar, dass zur Laufzeit die Bezeichner in deinem Programm nicht mehr existieren?

    Das ganze klingt nach einem Fall für eine map. Je nachdem, welche Arten von Datentypen zu erwarten sind, eventuell(!) auch noch so etwas wie boost::any.



  • map<string, int> xmldata;
    string s = readNameFromXmlFile();
    int i = readNumberFromXmlFile();
    xmldata[s] = i;
    cout << xmldata["Feuer"]; //wenn es "Feuer" noch nicht gibt wird es mit 0 initialisiert
    


  • Wenn Du so etwas wirklich selber machen willst, dann brauchst du eine Factory für die Klassen und die Klassen selber brauchen eine Map mit dem Membernamen als Key und einem Methodenzeiger auf die Set-Methode des entsprechenden Members.

    Ich würde aber heute eher etwas fertiges wie Boost Serialization verwenden.



  • Für die Initialisierung mit Default-Werten habe ich nun ein Lösung gefunden: Über den Konstruktor der Klasse.

    Für die erste Frage hatte ich mit etwas einfacherem gerechnet. Ich werde wohl hier zu statischen Platzhaltern [also im Beispiel: Element1, ..2, ..3, ..4, ..5] übergehen, die Elemente nutzen, die per XML gesetzt werden [1,2,3] - und die anderen außer acht lassen. Wenn Performance-Probleme auftauchen, kann ich mich immernoch mit der komplexen Aufgabe der serialization befassen 🙂

    Vielen Dank euch allen!

    - Corak


Anmelden zum Antworten