C# like statischer Constructor
-
SeppJ: Dein Vorschlag hat aber nicht den Effekt, dass der statische Ctor erst bei der ersten Erstellung eines Objekts der Klasse aufgerufen wird, sondern dass es bei Programmstart auf jeden Fall aufgerufen wird.
_confused_: bei dir muss an allen möglichen Stellen static_data() aufgerufen werden, was eben genau nicht das ist was der OP möchte.
Mein erster Gedanke ging in die Richtung von dem was Pria geschrieben hat, kann man allerdings noch verbessern:
template <class T> struct StaticCtor { protected: StaticCtor() { static auto b = []() -> bool {T::Init(); return true;}(); } }; #include <iostream> struct Foo : StaticCtor<Foo> { static void Init() { std::cout << "first use of Foo!\n"; } }; int main() { std::cout << 1 << '\n'; Foo a; std::cout << 2 << '\n'; Foo b; std::cout << 3 << '\n'; Foo c; std::cout << 4 << '\n'; }
-
Die Vererbung ist unnötig.
Ich würde es trennen - dann wird der Code auch gleich viel viel schöner.
-
Shade Of Mine schrieb:
Die Vererbung ist unnötig.
Hast recht - neue Version:
template <void (*fun)()> struct StaticCtor { StaticCtor() { static auto b = []() -> bool {fun(); return true;}(); } }; #include <iostream> struct Foo { static void Init() { std::cout << "first use of Foo!\n"; } StaticCtor<Init> sc; }; int main() { std::cout << 1; Foo a; std::cout << 2; Foo b; std::cout << 3; }-> ich kann alles mögliche als staischen ctor angeben, auch freie Funktionen...
-
pumuckl schrieb:
SeppJ: Dein Vorschlag hat aber nicht den Effekt, dass der statische Ctor erst bei der ersten Erstellung eines Objekts der Klasse aufgerufen wird, sondern dass es bei Programmstart auf jeden Fall aufgerufen wird.
Als ich nach dem Stichwort gegoogelt habe, stand in der MSDN:
Static constructors have the following properties:
[ ... ]
A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced.[ ... ]
The user has no control on when the static constructor is executed in the program.
Hervorhebung durch mich.
-
Okay, ich hatte mich eher auf die Fragestellung des OP konzentriert, nicht darauf, ob der letzte Teil korrekt war:
Pria schrieb:
Die Frage ist jetzt allerdings, [...] ob es nicht ein Möglichkeit gibt das so umzuschreiben, dass es nur bei Aufruf einer Methode oder erzeugung eines Objektes ein einziges Mal aufgerufen wird,
wie es bei C# der Fall ist?Dass es bei C# nicht der Fall ist hast du jetzt aufgezeigt. Jetzt darf Pria sich aussuchen, ob es das "wie bei C#" haben möchte oder so, wie er dir Frage formuliert hat

-
Hallo nochmal,
das verursacht bei mir immer einen Fehler wenn ich schreibe
template<typename T> struct static_ctor { public: static_ctor() { static auto b = []() -> bool {T::_init(); return true;}(); } };error C2159: Mehr als eine Speicherklasse angegeben
-
Das ist C++11, beim GCC z.B. musst du da mit -std=c++11 kompilieren. Aber so ganz nachvollziehen kann ich die Lösung nicht, ich mache das immer so:
#include <iostream> struct foo { static foo& get_instance() { static foo f; return f; } private: foo() { std::cout << "Initialized\n"; } ~foo() { std::cout << "Destructor\n"; } }; struct bar { bar() { static foo& dummy = foo::get_instance(); std::cout << "Used..\n"; } }; int main() { std::cout << "!!!\n"; bar b1, b2, b3, b4, b5; }
-
OK! Das wird wohl der Fehler gewesen sein. Nachdem ich alles wieder auf
die "Ursprungslösung" gesetzt habe, klappt es nun.Aber so ganz nachvollziehen kann ich die Lösung nicht, ich mache das immer so
Nun ja, die Lösung funktioniert und ich kann sie für mein Projekt einsetzen, dass ist doch die Hauptsache :xmas1:
-
Pria schrieb:
Nun ja, die Lösung funktioniert und ich kann sie für mein Projekt einsetzen, dass ist doch die Hauptsache :xmas1:
Und meine funktioniert nicht? :xmas2:
-
Habe ich nicht gesagt