Adakah Membahagikan Kelas C Templat kepada Fail .hpp dan .cpp Berasingan Boleh Dilaksanakan?
Apabila cuba menyusun kelas C templat merentas pengepala berasingan (.hpp) dan fail pelaksanaan (.cpp), anda mungkin menghadapi ralat pemautan. Pertimbangkan kod berikut:
// stack.hpp template <typename Type> class stack { // ... };
// stack.cpp template <typename Type> stack<Type>::stack() { // ... }
// main.cpp #include "stack.hpp" stack<int> s;
Penyusunan gagal dengan ralat "rujukan tidak ditentukan" untuk kaedah kelas templat. Walaupun boleh, memindahkan semua pelaksanaan kaedah ke dalam fail pengepala bukanlah penyelesaian yang ideal.
Mengapa Kompilasi Berasingan Gagal untuk Kelas Templat
Isu ini berpunca daripada fakta bahawa templat kelas tidak ditakrifkan sepenuhnya pada masa penyusunan. Pengkompil menjana kod untuk instantiasi tertentu berdasarkan parameter templat yang disediakan. Tanpa parameter templat, pengkompil tidak boleh menjana reka letak memori dan kod untuk kaedah dalam fail pelaksanaan.
Alternatif: Mengasingkan Struktur Data dan Algoritma
Untuk menyembunyikan butiran pelaksanaan sambil mengekalkan pemisahan, pertimbangkan untuk memisahkan struktur data daripada algoritma. Kelas templat harus mentakrifkan struktur data terutamanya, manakala kelas algoritma bukan templat beroperasi pada atau menggunakannya. Pendekatan ini secara berkesan menyembunyikan butiran pelaksanaan yang berharga tanpa memerlukan fail pelaksanaan berasingan untuk kelas templat.
Atas ialah kandungan terperinci Bolehkah Kelas C Templat Dipisahkan kepada Fail Pengepala dan Pelaksanaan Berasingan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!