Statischen Member initialisieren
-
Hallo Forum,
ich möchte einen static Member initialisieren. Kann man das vielleicht eleganter machen? Momentan sieht die Definition zu ClassX so aus:
ClassA *ClassX::m_ptrObj=0; // m_ptrObj ist static innerhalb von ClassX. Erstmal zu 0 machen. // Im Konstruktor wird die static Var initialisiert falls nicht schon geschehen: ClassX::ClassX(int InitWert) { if (m_ptrObj==0) m_ptrObj = New ClassA(Initwert); //Der Initwert steht jedoch erst nach Programmstart zur Verfügung. (In main berechnet) }Vielen Dank
L
-
Vielleicht so?
ClassA *ClassX::m_ptrObj=0; ClassX::ClassX(int InitWert) : m_ptrObj(new ClassA(InitWert)) { }
-
Daran habe ich auch schon gedacht. Jedoch kann man eine static Variable nicht in der Konstruktor InitListe intitialisieren.
-
Was du vor hast ist schlechter Design... Die Initialisierung eines statischen Members von der Konstruktion eines (des ersten) Objektes der Klasse abhängig machen.
Erklär mal welches Problem du lösen willst.
Wenn du dir ganz sicher bist dass es nur so gehen kann, lager den Zugriff auf die statische Variable in eine separate statische Funktion aus. Gewährleiste, dass niemand direkt auf diesen statischen Member zugreift, sondern nur über diese statische Funktion. Rufe im Konstruktor deines ClassX ebenfalls diese Methode auf.
Die Methode selber prüft auf NULL und initialisiert, oder gibt sofort das Objekt zurück.
-
Wenns _wirklich_ nötig ist, dann ist das ein Fall für das Singleton Pattern.
-
Also ich würde mir hier vielmehr Gedanken zum Thema Thread-Safety machen, als mir den Kopf über irgendwelche Schnörkel wie Auslagerung in Helper-Funktionen.
Und natürlich auch noch wichtig: Wer soll das Objekt dann wieder löschen, und wann genau soll das passieren? Wie kannst du garantieren dass es nicht zu früh gelöscht wird - also nicht bevor das letzte Objekt gelöscht wurde, welches die Variable braucht?
Und wie kannst du garantieren dass es nicht zu spät gelöscht wird, also nicht nachdem irgendwas gelöscht/de-initialisiert/... wurde, was du brauchst, um das Objekt korrekt löschen zu können?Alles nicht so einfach.
@Korntrauer:
Ich finde nicht dass es allgemein schlechtes Design ist, diverse Initialisierungen zu verzögern bis das erste Objekt einer Klasse konstruiert wird.
Es ist nur in C++ im Allgemeinen problematisch was die korrekte Umsetzung angeht. (Im Speziellen, wenn man auf Threads und DLLs/SOs und all diese schönen Dinge verzichtet, ist es auch in C++ einigermassen gut zu realisieren)In diesem Fall finde ich das Design auch fragwürdig, da "InitWert" jedesmal an den Konstruktor übergeben wird, aber nur beim 1. mal verwendet wird. Wenn ich einmal 1 und einmal 2 mitgebe, verhält sich das Programm anders, je nachdem ob ich zuerst das "einser" Objekt konstruiere, oder zuerst das "zweier" Objekt.
-
hustbaer schrieb:
In diesem Fall finde ich das Design auch fragwürdig, da "InitWert" jedesmal an den Konstruktor übergeben wird, aber nur beim 1. mal verwendet wird. Wenn ich einmal 1 und einmal 2 mitgebe, verhält sich das Programm anders, je nachdem ob ich zuerst das "einser" Objekt konstruiere, oder zuerst das "zweier" Objekt.
Genau das hab ich ja auch gemeint. Die Gestalt des static members ist vom als erstes konstruierten Objekt abhängig. Der übergebene Parameter eines normalen Konstruktors beeinflusst eine statische Variable...
-
Es geht um einen Zufallsgenerator der früher pro Objekt exisitiert hat und nachdem ich festgestellt habe das sich nun alle Objekte gleich verhalten soll er nun static werden.
Ich werde es wie Korntrauer machen:
Eine extra static Funktion die einmal gerufen wird um den ZufallsGen zu setzen. Alle weiteren Aufrufe laufen ins leere da der Rand nun bereits exisitert. Über Freigabe brauche ich mir keine Gedanken zu machen? Static Variablen werden doch eh erst am Programmende entfernt. Das würde doch dann das Betriebsystem machen. Wenn es für C++ keinen static Konstruktor gibt dann doch auch keinen Destruktor.
-
Freund Luigi, du machst hier "new".
Naja, what shalls.