Frage zur Programmiertechnik, Objekte übergeben
-
Hallo!
Ich erzeuge in der main-Funktion meines Programms ein Objekt, das sämtliche
Konfigurationseinstellungen enthält. Diese werden in vielen Klassen benötigt.
Ich habe dieses Objekt auf dem Heap mit new angelegt.
Nun muss ich ja dieses Objekt sozusagen durchreichen. Es wird in fast allen
Klassen benötigt.
Ist es sinnvoll, jedesmal den Zeiger zu übergeben, oder besser als Referenz.
Oder gibt es einen Lösungsansatz, der noch vorteilhafter ist?
-
pointer vs referenz:
referenzen musst nie auf null testen.
-
Ist dieses Konfigurations-Objekt nur einmalig im gesamtem Programm vorhanden? Weil dann kannst du ein Singleton aus deiner Konfig-Klasse machen, und brauchst dieses Konfig-Objekt nicht durchreichen, sondern kannst es abfragen.
Singleton-Pattern lautet hier also das Stichwort. In der LOKI-Bibltiothek müsste auch eine Implementierung als Template da sein. Aber man kann dieses auch selber einfach implementieren. Codebeispiele findet man auch im Web.
-
Singleton-Pattern ist in diesem Programm ungeeignet.
Es werden noch weitere Objekte dieser Klasse im Programm verwendet,
allerdings nicht als Träger der Konfigurationen.
Sollte ich das Objekt vielleicht sogar global machen, wenn es in fast
jeder Klasse benötigt wird?
Ansonsten müsste ich wohl wirklich Zeiger bzw. Referenzen durchreichen.
Das Objekt darf auch von mehr als einer Klasse verändert werden.
-
mase schrieb:
Singleton-Pattern ist in diesem Programm ungeeignet.
Es werden noch weitere Objekte dieser Klasse im Programm verwendet,
allerdings nicht als Träger der Konfigurationen.
Sollte ich das Objekt vielleicht sogar global machen, wenn es in fast
jeder Klasse benötigt wird?
Ansonsten müsste ich wohl wirklich Zeiger bzw. Referenzen durchreichen.
Das Objekt darf auch von mehr als einer Klasse verändert werden.klingt danach als ob du 2 klassen mit zwei verschiedenen anwendungsbereichen in eine getan hast (konfigurations objekt + irgenwelche anderen operationen).
ne trennung + singleton wär da ne lösung.
ansonsten übergabe des objektes an alle davon abhängigen (referenz bzw pointer)
-
Es werden noch weitere Objekte dieser Klasse im Programm verwendet,
allerdings nicht als Träger der Konfigurationen.Dann hast du hier nen Designfehler. Dann mach wenigstens eine weitere Klasse, die die bisherige Klasse kapselt und dann singleton.
class bisherige_klasse { public: // keine Ahnung was du bisher für Methoden hast: string get_x(); string get_y(); }; class global_config : private bisherige_klasse { public: // private Methoden public machen: using bisherige_klasse::get_x; using bisherige_klasse::get_y; };Dann kannst du global_config als Singlton machen. Und die andere Klasse kann trotzdem mehrmals instanziert werden. Außerdem hast du dann auch endlich eine richtige Konfig-Klasse.
Ein globales Objekt würde ich immer versuchen zu vermeiden.
-
Es handelt sich um eine erweiterte Listenklasse, die config und ini-Dateien
verarbeiten kann. Ich kann Eiträge einfügen, ändern, ausgeben, und das
ganze als Datei speichern, bzw. laden.
Ich verwende in meinem Programm 2 solcher Liste, die als Datei gespeichert
werden sollen. Eine davon ist die Konfiguration des Programms.
Du meinst also, ich sollte von dieser Klasse 2 Klassen ableiten, und die
eine als Singlton behandeln?
-
Das Singleton-Pattern wendet man normalerweise dann an, wenn eine Klasse nur einmal instanziert werden darf. Nun, dein Konfig-Objekt könnte ja auch mehrmals instanziert werden. Es wäre also nicht falsch, dieses Objekt überall durchzuschleifen. Wobei ich mich frage, in wieviel Objekten das sein wird? Tausende? Oder werden es eher nur ein paar? Dann schleif es durch und merk es dir als Referenz oder Pointer in den Objekten. Du mußt es ja nicht bei jedem Methodenaufruf mitgeben. Meistens kann man das Konfig-Objekt gleich dem Konstruktor eines Objektes geben, merkt es sich in dem Objekt und gut ist.
So, aber bevor du ein globales Objekt benutzt, und ein Konfig-Objekt meistens (nicht zwingend!) einmalig in einem Programm vorhanden ist, solltest du vielleicht eher über ein Singleton nachdenken, bevor es global wird. Es ist nur ein Vorschlag von mir.
Übrigens habe ich in meinem Beispiel oben nicht abgeleitet!!! Lies bitte meinen Code genauer! Ich habe das private-Schlüsselwort benutzt! Und das heißt "ist implementiert mit...". Ist schon was anderes als "ist ein...".