Nominate our 2022 Qt Champions!

Globale Variablen mit Static, oder bessere Alternative?



  • Guten Tag,

    ich habe aktuell ein Problem welches bereits häufiger in Foren thematisiert wurde, allerdings kann ich die Lösungen nicht auf meinen Fall übertragen.
    Ich habe eine Klasse "globalValues" erstellt, in der aus einer Datei Werte für Variablen gelesen werden. Diese Werte benötige ich in allen meiner anderen Klasse, so dass ich in jeder Klasse eine Instanz der Klasse "globalValues" erzeuge. Hier mein Code:

    class globalValues
    {
    public:
        globalValues();
    
        QString iniPath="globalValues.ini";
    
        int var1=10;
        int var2=20;
        int var3=30;
        int var4=40;
    
        void load_configfile();
    };
    
    
    
    globalValues::globalValues()
    {
        load_configfile();
    }
    
    void globalValues::load_configfile()
    {
        qDebug() << "load_config";
    
        QFile file(iniPath);
        if(!file.exists()){		//Datei wird erstellt wenn sie nicht existiert
            QSettings settings(iniPath,QSettings::IniFormat);
            settings.setValue("var1",var1);
            settings.setValue("var2",var2);
            settings.setValue("var3",var3);
            settings.setValue("var4",var4);
        }
    
    
        QSettings settings(iniPath,QSettings::IniFormat);
        var 1= settings.value("var1").toInt();
        var 2= settings.value("var2").toInt();
        var 3= settings.value("var3").toInt();
        var 4= settings.value("var4").toInt();
    }
    

    Den Zugriff auf die Variablen bekomme ich dann über:

    globalValues values;
    int x = values.var1;
    

    Ich weiß, das macht man normal mit "getter-Funktionen", aber das sollte jetzt nicht das Thema sein.

    Mein Problem ist: Das Ganze funktioniert zwar, aber finde ich irgendwie unschön, da meine .ini-Datei bei jeder Instanz neu geladen wird, d.h. z.B. bei meinem Programmstart wird die Datei insgesammt 15mal geladen.
    Ich könnte jetzt natülich auch mit Pointern und Referenzen arbeiten, die ich dann an die anderen Klassen übergebe, aber auch das finde ich nicht so wirklich elegant.

    Ich habe nun das keyword "static" entdeckt, mit dem man solche Variablen über alle Instanzen der Klasse "globalValues" gleich halten kann. Mein Problem ist nur, dass ich die Wertezuweisung außerhalb der Klasse "globalValues" machen müsste. Also die "load_configfile()"-Funktion müsste ich woanders unterbringen und die Werte beim Programmstart mit "int globalValues::var1 = XXX" zuweisen, wobei XXX natürlich der aus der .ini geladene Wert ist.
    Theoretisch sollte das möglich sein, auch wenn ich es noch nicht getestet habe. Allerdings frage ich mich, ob es nicht noch schöner geht? Kann ich die Wertezuweisung nicht doch irgendwie in der Klasse "globalValues" direkt machen?
    Wie würdet ihr sowas lösen? Vielleicht mit einem ganz anderem Weg?

    Vielen Dank und ein schönes Wochenende!


  • Lifetime Qt Champion

    Wenn eine Klasse in anderen Klassen benötigt wird, übergib einen Pointer der Klasse dort wo Du sie brauchst.



  • Hi,

    bei Fragen bezüglich Sprache und Entwurfsmöglichkeiten empfehle ich die Lektüre der Richtlinien des Meisters.

    Ist zwar auf English, aber es wird nicht nur beschrieben, was man nicht tun soll, sondern auch erklärt, wie man es besser macht.



  • @django-Reinhard wow, super. Vielen Dank für die Webseite. Da werde ich einige Monate brauchen bis ich da durch bin und alles verstanden habe. Aber nützlich in jedem Fall.

    Trotzdem nochmal zu meinem Fallbeispiel.
    Seht ihr grundsätzlich ein Problem oder eine Gefahr, dass die .ini-datei immer wieder geladen werden muss? Wie gesagt, in jeder meiner Klasse erzeuge ich ein neues objekt global-values, d.h. die ini wird immer wieder geladen. Bei Programmstart ca.15mal und während der Nutzung je nach Userverhalten immer mal wieder. Die .ini liegt lokal, also immer verfügbar.
    Könnte es trotzdem problematisch werden?
    Ich bin mir fast sicher, auf der Webseite steht irgendwo, dass man sowas nicht macht. Aber die Frage ist, ob es zu Problemen führen kann. (Z.B. lesefehler, gleichzeitiger Zugriff oder irgendsowas....) Wie gesagt, in der Praxis hat es bisher geklappt, aber das heißt ja nicht, dass trotzdem irgendwas passieren könnte)



  • @Freakonaleash said in Globale Variablen mit Static, oder bessere Alternative?:

    Wie gesagt, in jeder meiner Klasse erzeuge ich ein neues objekt global-values, d.h. die ini wird immer wieder geladen. Bei Programmstart ca.15mal und während der Nutzung je nach Userverhalten immer mal wieder. Die .ini liegt lokal, also immer verfügbar.
    Könnte es trotzdem problematisch werden?
    Ich bin mir fast sicher, auf der Webseite steht irgendwo, dass man sowas nicht macht

    Wieso lädst du sie dann nicht nur einmal und übergibst den Pointer an deine Klassen (so wie @Christian-Ehrlicher vorher schon gesagt hat)?

    @Freakonaleash said in Globale Variablen mit Static, oder bessere Alternative?:

    Ich könnte jetzt natülich auch mit Pointern und Referenzen arbeiten, die ich dann an die anderen Klassen übergebe, aber auch das finde ich nicht so wirklich elegant.
    Ich habe nun das keyword "static" entdeckt

    Pointer sind nicht elegant, aber static erscheint es dir? :o)


  • Moderators

    @Freakonaleash Auch auf die Gefahr hin, dass du das Falsche aus diesem Ratschlag lernst, In C++ gibt es das Prinzip der "Singleton's".
    Prinzipiell genauso ungern gesehen wie Globale Variablen. Aber sie haben ihren Platz und Verwendungszweck.



  • Gibt es das nicht? Was spricht gegen QSettings?


  • Lifetime Qt Champion



  • @jsulm achso ... ja - also was der "Freakonaleash" ganz oben fragt: eine Möglichkeit Konfiguration zentral abzulegen ohne selbst ein Globales Objekt behandeln zu müssen oder sich um File I/O zu kümmern.


  • Lifetime Qt Champion

    @HoMa Siehe was @J-Hilk vorgeschlagen hat (Singleton).
    QSettings kann natürlich benutzt werden, wenn Settings dauerhaft gespeichert werden sollen.


Log in to reply