Möglichkeiten statische Elemente einer Klasse zu initialisieren
-
Hello again,
wenn ich statische Elemente in meiner Klasse habe kann ich diese ja über statische Methoden initialisieren. Gibt es noch andere Möglichkeiten diese zu initialisieren? Bei der Definition geht das ja nicht da das Element ja dazu konstant sein müsste, so habe ich das jedenfalls verstanden.
-
...
-
Du musst sie ja außerhalb der Klasse ohnehin definieren, dort kannst Du sie ja dann wie eine normale globale Variable initialisieren:
// Header class x { static bool b; }; // Sourcefile bool x::b = true;
-
Gibt es noch andere Möglichkeiten diese zu initialisieren
initialisierungsliste?
-
antialias schrieb:
initialisierungsliste?
Es ging doch um statische Member...
-
antialias schrieb:
Gibt es noch andere Möglichkeiten diese zu initialisieren
initialisierungsliste?
Geht bei static nicht.
-
@cppfrager:
Wenn zur Initialisierung keine (Laufzeit-)Berechnung nötig ist, also wenn es sich nur um konstante Werte handelt, dann funktioniert das so wie es schon Mr X gezeigt hat. Und zwar völlig problemlos.Wenn Berechnungen nötig sind, dann kann man sich mittels Funktionen wie
boost::call_oncedie Funktionalität eines statischen Konstruktor nachbauen.
Dazu muss man dann überall wo man auf eine solche statische Variable zugreift den "statischen Konstruktor" übercall_onceaufrufen. Inetwa so:// .h class foo { public: void f(); int f2(); // ... private: static void static_ctor(); static void static_ctor_impl(); static int s_static_int; }; // .cpp namespace { boost::once_flag s_foo_static_ctor_once_flag = BOOST_ONCE_INIT; } void foo::static_ctor() { boost::call_once(&foo::static_ctor_impl, s_foo_static_ctor_once_flag); } void foo::static_ctor_impl() { s_static_int = SomeCalculation(); } void foo::f() { static_ctor(); s_static_int++; } int foo::f2() { static_ctor(); return s_static_int; } // ...
-
Man könnte es ja auch etwas simpler gestalten und boost weglassen (was ich hier sowieso für Schwachsinnig halte):
static abc_init_static = false; class abc{ private: static int var; static void init_static(); public: abc(){ if(!abc_init_static) init_static(); } f1(){ var++; } f2(){ var++; } ctor(){ abc_init_static = true; var = 0; } };
-
Sehr nette Ideen hier.
@FallenAngel: Ich habe dein Beispiel leider nicht zum laufen bekommen. Soll ctor eigentlich init_static sein? Wenn ich das so mache und die fehlenden Schlüsselwörter hinzufüge klappt es leider auch nicht. Kann es sein das es nur geht wenn eine externe Funktion das statische Datenelement definiert, und das Boost versteckt genau sowas macht?
Sorry für die vielen Fragen ich bin absoluter C++ Anfänger wie man sieht

-
Fallen Angel schrieb:
[...]
Das ist, im Gegensatz zum Beispiel von hustbaer, aber nicht Threadsicher.
-
Tachyon schrieb:
Fallen Angel schrieb:
[...]
Das ist, im Gegensatz zum Beispiel von hustbaer, aber nicht Threadsicher.
Davon hat hier auch niemand gerendet. Wir sind doch im C++ Forum?
Ja, ctor soll init_static darstellen. Hab mich da gestern anscheinend verschrieben
-
Fallen Angel schrieb:
Davon hat hier auch niemand gerendet. Wir sind doch im C++ Forum?
Ja, und? Der nächste Standard steht in den Startlöchern, womit Threading sehr wohl ein Thema ist. Weiterhin ist die Boost-Lösung deutlich weniger frickelig.