Heim >Backend-Entwicklung >C++ >Wie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?
So erzwingen Sie die Initialisierung eines statischen Mitglieds
Ein häufig übersehenes Verhalten in C ist, dass statische Mitglieder nicht garantiert automatisch initialisiert werden. Man kann davon ausgehen, dass das Mitglied mit der ersten Instanziierung der konkreten Klasse initialisiert wird. Wie aus dem Zitat aus dem Standard hervorgeht, geschieht dies jedoch nur, wenn das statische Element aktiv genutzt wird:
"* Insbesondere findet die Initialisierung (und alle damit verbundenen Nebenwirkungen) eines statischen Datenelements nicht statt es sei denn, das statische Datenelement wird selbst in einer Weise verwendet, die die Existenz der Definition des statischen Datenelements erfordert 🎜>
Intuitiv könnte man erwarten, dass Dummy bei der Instanziierung von Bar initialisiert wird. Dies geschieht jedoch nicht.
Die Frage<code class="cpp">template <class D> char register_() { return D::get_dummy(); // static function } template <class D> struct Foo { static char const dummy; }; template <class D> char const Foo<D>::dummy = register_<D>(); // static member initialized with `register_<D>()` struct Bar : Foo<Bar> { static char const get_dummy() { return 42; } };</code>Wie kann man die Initialisierung von Dummy erzwingen, ohne dass eine Instanz von Bar oder Foo erforderlich ist? Darüber hinaus sollte die Lösung keine explizite Referenzierung des Mitglieds durch den Benutzer von Foo erfordern.
Potenzielle Lösungen
Lösung 1 (Minimale Auswirkung auf die abgeleitete Klasse)
Die folgende Änderung an der get_dummy()-Methode von Bar erzwingt die Initialisierung von Dummy:
Lösung 2 (Keine Änderung an der abgeleiteten Klasse)
Diese Lösung nutzt Template-Metaprogrammierung:
<code class="cpp">static char const get_dummy() { (void)dummy; return 42; }</code>
Oder es kann ohne Einführung zusätzlicher Mitglieder erfolgen:
Das obige ist der detaillierte Inhalt vonWie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!