Problem mit Konstruktor und Elementinitialisierungsliste



  • Servus,

    ich habe mich gerade in einem Konstruktor verbissen, der dämliche Argumente bekommt.
    Kurz gesagt besteht das Problem darin, dass der Konstruktor den Dateinamen eines config-files bekommt, wo das drin steht, was ich brauche um den Elternteil zu initialisieren.

    In Code asugedrückt, ist das Problem folgendes:

    class Parent {
    public:
      Parent(const std::string& arg1, int arg2, int arg3);
    };
    
    class Child {
    public:
      Child(const std::string& config_file_name):
      Parent(wert_der_aus_config_file_kommt1, 
             wert_der_aus_config_file_kommt2,
             wert_der_aus_config_file_kommt3)
    {}
    };
    

    Ihr seht, wo das Problem liegt: Um an den Wert zu kommen, muss ich das Config-File lesen und parsen. Das kann ich im Konstruktor-Body. Ich brauche die Werte aber schon in der Elementinitialisierungsliste, sonst kann ich ja den Parent nicht mehr initialisieren.
    Signatur des Konstruktors ist durch die Applikation, die die Klasse benutzt, vorgegeben, ich kann mir also nicht die vor-verarbeiteten Werte von draußen reingeben lassen.
    Das Auslesen des config-Files in den Konstruktor von Parent zu verlagern wäre eine Option, die ist aber mit großen Schmerzen verbunden, da ich dann eine Menge Information in Parent bringen muss, die in Parent nix verloren hat => kein orthogonales Design mehr.

    Habt ihr bessere Vorschläge?

    Philipp


  • Mod

    PhilippM schrieb:

    Habt ihr bessere Vorschläge?

    Keine Vererbung benutzen? Das was du hier beschreibst klingt überhaupt nicht nach einer Ist-Ein-Beziehung.

    Ansonsten: Man kann auch komplexe Ausdrücke in die Intitialisierungsliste schreiben, du könntest also auch einen Parserfunktionsaufruf als Argument für die Basisklasse dort unterbringen.



  • SeppJ schrieb:

    Keine Vererbung benutzen?

    Da ist in der Tat was dran. Aber leider bin ich auch hier durch die Gegebenheiten des Projekts eingeschränkt. Ich werde das nicht aufbrechen können, leider. Leider kann man nicht immer das machen, was sinnvoll wäre 😞

    Ansonsten: Man kann auch komplexe Ausdrücke in die Intitialisierungsliste schreiben, du könntest also auch einen Parserfunktionsaufruf als Argument für die Basisklasse dort unterbringen.

    Hmm, wie sähe das aus?
    Der Aufruf zum holen der Werte sieht so aus:

    Config cfg(cfg_file_name);
    // Set default values
    cfg.setStringValue(VALUE_NAME1, VALUE_DEFAULT1);
    cfg.setValue(VALUE_NAME2, VALUE_DEFAULT2);
    // load from file, this will override the defaults
    cfg.loadFromFile();
    // write to file. Ensures default values are written to file (if file didn't exist)
    cfg.writeToFile();
    std::string arg1 = cfg.getStringValue(VALUE_NAME1);
    int arg2 = cfg.getValue(VALUE_NAME2);
    

    Wie soll ich denn diesen Rhabarber in der Elementinitialisierungsliste unterbringen? Eine statische Memberfunktion machen?

    Philipp


  • Mod

    PhilippM schrieb:

    Wie soll ich denn diesen Rhabarber in der Elementinitialisierungsliste unterbringen? Eine statische Memberfunktion machen?

    Ja. Oder eine freie Funktion.


Anmelden zum Antworten