Wie globale Optionen in Programm verwalten?
-
Hallo,
hoffe dass mein Problem nicht zu trivial ist, mir fehlt leider auch das richtige Suchwort für eine gescheite Suche zum Problem. Bin auch nicht grad der Programmierheld.Ich habe hier eine relativ große Anwendung, die in Klasse A Einstellungen verwaltet.
Klasse A ruft Methode 1 in Klasse/Datei B auf.
Klasse/Datei B ruft Methode 2 in Klasse/Datei C auf.
...usw... , teilweise static,also nicht Objekte
Klasse/Datei E ruft Methode 5 in Klasse/Datei F auf.Jetzt würde ich gerne aber auf die Einstellungen aus Klasse A in Methode 5 zugreifen! Es geht darum, Debugausgaben zu steuern. Klasse A enthält eine einfache GUI und ich würde halt gerne in der GUI entscheiden, ob ich im nächsten Durchlauf in der Methode 5 die ganzen Debugausgaben mache oder nicht. Leider "kennen" sich die Dateien/Klassen nur in die eine Richtung (A included B,...).
Muss ich jetzt diese Optionen als Parameter durch die ganzen Funktionen mitschleifen oder gibt es in C++ eine andere lesbare und sauberere Lösung?
Also in irgendeiner Art Klasse A includen und die Optionen da haben. Was macht man da üblicherweise? Wie holt man sich das eine Objekt? Oder geht das ganz anders?Naja, danke schon einmal für eure Ideen und Denkanstöße
Grüße
Adda
-
Äh.
Viele Möglichkeiten.
Globale Variablen, Singletons, immer ein "Einstellungen" Objekt rumreichen wie du schon beschrieben hast... such dir was aus.Für Logging nimmt man üblicherweise Singletons. Du kannst aber eigentlich genausogut globale Variablen nehmen, ist im Grund genommen schon egal, weil beides gleich "pfui" ist.
-
hustbaer schrieb:
Für Logging nimmt man üblicherweise Singletons. Du kannst aber eigentlich genausogut globale Variablen nehmen, ist im Grund genommen schon egal, weil beides gleich "pfui" ist.
Nein, weil du bei Singletons die konstruktionsreihenfolge mitbestimmen kannst, bzw wieder auferstehen wenn am ende noch wer loggen muss...
Logging ist das perfekte Beispiel für Singletons.
-
Also ich habe bei größeren Projekten immer eine Config-Klasse dabei (die auch aus .ini-Files lesen kann).
Ein Pointer auf ein Objekt dieser Klasse wird im Konstruktor jeder anderen Klasse an selbige übergeben. Dadurch hat jede Funktion Zugriff auf alle Config-Einträge.
-
Kannst dir ja mal boost::program_options anschauen, vllt. taugen die ja was für dich. Ich wollte die mal für mein Projekt verwenden, aber die Funktionalität war mir dann doch zu eingeschränkt und musste es am Ende doch selber schreiben, da ich nicht nur getypte Optionen haben wollte, sondern mit Default-Werten, optionale Optionen und pflichtoptionen.
Zur Laufzeit können neue Optionen hinzugefügt werden und alte geändert. Beim beenden wird eine neue Konfigurationsdatei aus diesen erzeugt und abgespeichert.Aber ich frage mich gerade was eine Config-Datei mit deinem Debugging zu tun hat, du kannst zwar das Debugging-Level darüber steuern, aber das sind ja zwei paar Schuhe.
-
Also es geht in dem Projekt um Bildverarbeitung. Ein ganzes Video wird eingelesen. Mich interessieren im Endeffekt nur die Debuginformation an wichtigen Stellen im Video. Mein Programm könnte durchweg Unmengen an Debuginformationen rausschmeissen, aber ich hätte gern manuell die Macht, mal die Informationen für dden nächsten Schritt/das nächste Bild ein- und auszuschalten. Also Debuginformationen sind hier dann eher als Informationen für das humane, manuelle Debuggen zu verstehen
Ich will halt sehen, ob alles in allen Zwischenschritten so aussieht, wie es aussehen soll.Naja, das sind schon super Ansätze und ich werd mich auf jeden Fall zu den genannten Themen im Netz schlau machen. Danke schonmal!
Grüße
Adda
-
also ich pack "Einstellungen" stets in eine singleton klasse - beim veraendern der einstellungen, zb ueber ein settings dialog, wird es abgespeichert, und die singleton "Settings" klasse liest immer live aus was aktuell abgespeichert ist
das hat den positiven effekt das aenderungen direkt moeglich sind, und zur laufzeit benutzt werden
da settings normalerweise ueberall greifen sollen ist das der perfekte anlass einer singleton