Dalam C , ahli statik boleh dimulakan menggunakan struct helper bersarang. Walaupun pendekatan ini berfungsi dengan baik untuk kelas bukan templat, ia boleh menimbulkan cabaran dalam kelas dengan parameter templat.
Pertimbangkan contoh berikut, di mana pembantu permulaan ahli statik digunakan dalam kelas templat:
<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; } }; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } // [3] }; static std::string mB; static InitHelper mInit; // [4] static const std::string& getB() { return mB; } static InitHelper& getHelper() { return mInit; } };</code>
Dalam senario ini, pemerhatian berikut dibuat:
Tingkah laku yang tidak dijangka berpunca daripada gelagat permulaan ahli statik dalam kelas templat. Menurut piawaian ISO/IEC C 2003 (14.7.1), pemulaan ahli data statik berlaku hanya jika ahli data statik itu sendiri digunakan dalam cara yang memerlukan takrifannya wujud.
Kepada elakkan pergantungan pada permulaan tersirat dan memastikan susunan permulaan yang konsisten, adalah disyorkan untuk mengkhususkan ahli data statik secara eksplisit dalam templat kelas. Dalam kes ini:
<code class="cpp">template<> std::string B<int>::mB = "Hello, I'm B (int specialization).";</code>
Dengan mengkhususkan ahli data statik secara eksplisit untuk setiap instantiasi kelas templat, pemulaan dicetuskan secara eksplisit dan gelagat yang diingini dicapai tanpa perlu mengakses pembantu pemula.
Atas ialah kandungan terperinci Bagaimanakah anda boleh memulakan ahli statik dengan pasti dalam kelas C templat menggunakan struktur pembantu bersarang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!