Rumah >pembangunan bahagian belakang >C++ >Bolehkah Kelas Templat C Dipisahkan kepada Fail .hpp dan .cpp?
Memisahkan Kelas C Templat kepada Fail .hpp/.cpp: Adakah Mungkin?
Masalah:
Percubaan untuk memisahkan kelas C templat kepada fail .hpp dan .cpp menghasilkan ralat penyusunan disebabkan oleh rujukan yang tidak ditentukan kepada pembina dan pemusnah simbol.
main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()' main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()'
Kod:
stack.hpp
#ifndef _STACK_HPP #define _STACK_HPP template <typename Type> class stack { public: stack(); ~stack(); }; #endif
st ack.cpp
#include <iostream> #include "stack.hpp" template <typename Type> stack<Type>::stack() { std::cerr << "Hello, stack " << this << "!" << std::endl; } template <typename Type> stack<Type>::~stack() { std::cerr << "Goodbye, stack " << this << "." << std::endl; }
main.cpp
#include "stack.hpp" int main() { stack<int> s; return 0; }
Jawapan:
Ia tidak boleh dilaksanakan untuk melaksanakan kelas templat dalam fail .cpp yang berasingan dan menyusunnya. Pelaksanaan mesti disertakan dalam fail .hpp kerana pengkompil memerlukan pengetahuan tentang jenis data apabila menjana susun atur memori dan definisi kaedah untuk kelas templat. Percubaan untuk menyusun fail .cpp secara bebas akan mengakibatkan isu berikut:
Alternatif Penyelesaian:
Untuk menyembunyikan butiran pelaksanaan, pertimbangkan untuk mengasingkan struktur data dan algoritma. Buat kelas templat untuk mewakili struktur data, manakala kelas bukan templat mengendalikan algoritma dan menggunakan struktur data. Ini membolehkan penyembunyian butiran pelaksanaan penting dalam perpustakaan berasingan tanpa bergantung pada kelas templat.
Atas ialah kandungan terperinci Bolehkah Kelas Templat C Dipisahkan kepada Fail .hpp dan .cpp?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!