Permulaan Ahli Statik dalam Kelas Templat
Apabila memulakan ahli statik kelas templat, adalah penting untuk memahami cara instantiasi templat mempengaruhi definisi ahli.
Dalam kod yang disediakan, permulaan ahli statik dibalut dalam struct helper bersarang untuk mengelakkan isu dengan kelas bukan templat.
Walau bagaimanapun, apabila kelas yang disertakan diparameterkan oleh templat, struct inisialisasi bersarang tidak boleh dibuat seketika melainkan objek pembantu diakses dalam kod utama.
Memahami Instalasi Templat Tersirat
Gelagat permulaan ahli statik dalam templat dikawal mengikut piawaian ISO/IEC C 2003 (14.7.1). Mengikut piawaian ini:
- Melainkan dinyatakan secara eksplisit atau dikhususkan, ahli templat kelas secara tersirat apabila dirujuk dalam konteks yang memerlukan takrifannya.
- Pengawalan data statik ahli berlaku hanya jika ahli data itu sendiri digunakan dengan cara yang memerlukan kewujudannya.
Analisis Kod
-
[1] mengulas dan [2] mengulas: Memandangkan tiada rujukan kepada ahli data statik, takrifan mereka (termasuk pengisytiharan dan instantiasi) tidak dibuat, menyebabkan tiada kesan sampingan.
-
[1] tidak diulas: B::getB() merujuk B::mB, yang memerlukan kewujudannya. Walau bagaimanapun, B::mInit tidak digunakan, yang membawa kepada bukan instantiasi. Pembina untuk B::InitHelper tidak dilaksanakan, menyebabkan B::mB tidak diberikan.
-
[1] dan [2]
-
Kesimpulan dan Elegan PenyelesaianGelagat standard membayangkan bahawa ahli data statik tidak dimulakan secara automatik melainkan ia digunakan. Untuk mengelakkan isu ini, pertimbangkan untuk menggunakan pengkhususan eksplisit untuk mentakrifkan ahli data statik secara eksplisit sebelum merujuknya. Ini menguatkuasakan pemulaan tertib, kerana pengkhususan eksplisit dianggap sebagai pengisytiharan biasa.
Atas ialah kandungan terperinci Mengapa Ahli Statik Saya dalam Kelas Templat Tidak Dimulakan Apabila Digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!