Rumah >pembangunan bahagian belakang >C++ >Bolehkah Kelas C Templat Dipisahkan kepada Fail Pengepala dan Pelaksanaan Berasingan?

Bolehkah Kelas C Templat Dipisahkan kepada Fail Pengepala dan Pelaksanaan Berasingan?

Linda Hamilton
Linda Hamiltonasal
2024-12-13 18:55:10492semak imbas

Can Templated C   Classes Be Split into Separate Header and Implementation Files?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn