Heim > Backend-Entwicklung > C++ > Hauptteil

Wie initialisiere ich statische Mitglieder in verschachtelten Vorlagenfunktionen in C?

Barbara Streisand
Freigeben: 2024-11-01 16:47:02
Original
800 Leute haben es durchsucht

 How to Initialize Static Members in Nested Template Functions in C  ?

Initialisierung statischer C-Mitglieder innerhalb verschachtelter Vorlagenfunktionen

Die Initialisierung statischer Mitglieder kann durch verschachtelte Hilfsstrukturen erreicht werden, insbesondere in Klassen ohne Vorlagen. Bei diesem Ansatz können jedoch Probleme auftreten, wenn die umschließende Klasse durch eine Vorlage parametrisiert wird. Insbesondere wenn im Hauptcode nicht auf das Hilfsobjekt zugegriffen wird, wird die verschachtelte Initialisierungsklasse möglicherweise nicht instanziiert.

Betrachten Sie das folgende vereinfachte Beispiel, das die Initialisierung eines Vektors veranschaulicht:

<code class="cpp">struct A {
    struct InitHelper {
        InitHelper() { A::mA = "Hello, I'm A."; }
    };
    static std::string mA;
    static InitHelper mInit;

    static const std::string& getA(){ return mA; }
};
std::string A::mA;
A::InitHelper A::mInit;


template<class T>
struct B {
    struct InitHelper {
        InitHelper() { B<T>::mB = "Hello, I'm B."; }
    };
    static std::string mB;
    static InitHelper mInit;

    static const std::string& getB() { return mB; }
    static InitHelper& getHelper(){ return mInit; }
};
template<class T>
std::string B<T>::mB;
template<class T>
typename B<T>::InitHelper B<T>::mInit;</code>
Nach dem Login kopieren

Beim Kompilieren mit g 4.4.1 werden mehrere Beobachtungen gemacht:

  • Mit [1] und [2] auskommentiert, A = Hallo, ich bin A. Dies bedeutet, dass die Initialisierung wie vorgesehen funktioniert.
  • Mit [1] unkommentiert, A = Hallo, ich bin A. B = Dies zeigt, dass die Initialisierung von B::mB nicht ausgelöst wird automatisch.
  • Wenn sowohl [1] als auch [2] unkommentiert sind, A = Hallo, ich bin A. B = Hallo, ich bin B. Dies bestätigt, dass der Zugriff auf B: :mInit (bis [2]) löst die Initialisierung von B::mB aus.
  • Wenn [1] kommentiert und [2] unkommentiert ist, tritt ein Segfault auf, der darauf hinweist, dass durch den direkten Zugriff auf Helfer selbst wird die Initialisierung von B::mB vorzeitig versucht, was zu einem Fehler führt.

Dieses Verhalten ist auf die Interpretation des ISO/IEC C 2003-Standards (14.7.1) durch den Compiler zurückzuführen. Der Standard legt Folgendes fest:

"Sofern ein Mitglied einer Klassenvorlage oder einer Mitgliedsvorlage nicht explizit instanziiert oder explizit spezialisiert wurde, wird die Spezialisierung des Mitglieds implizit instanziiert, wenn auf die Spezialisierung in a verwiesen wird Kontext, der das Vorhandensein der Elementdefinition erfordert; insbesondere findet die Initialisierung (und alle damit verbundenen Nebenwirkungen) eines statischen Datenelements nicht statt, es sei denn, das statische Datenelement selbst wird auf eine Weise verwendet, die die Definition des statischen Datenelements erfordert existieren."

Dies erklärt, warum im gegebenen Beispiel die statischen Mitglieder nicht initialisiert werden, bis auf sie über die Methoden getB() oder getHelper() zugegriffen wird. Eine explizite Instanziierung der Klassenvorlage oder Mitgliedsvorlage in der Hauptfunktion würde deren Initialisierung an diesem Punkt erzwingen. Für Szenarien, in denen ein direkter Zugriff nicht möglich ist, gibt der Standard jedoch keine elegante Problemumgehung für die Initialisierung statischer Mitglieder innerhalb verschachtelter Vorlagenfunktionen an.

Das obige ist der detaillierte Inhalt vonWie initialisiere ich statische Mitglieder in verschachtelten Vorlagenfunktionen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!