LẬP TRÌNH C/C++ NÂNG CAO Yêu cầu trước khi đọc học xong Lập trình C/C++ căn bản BÀI 6 TEMPLATE (TIẾP THEO) Trình biên dịch và template Trong bài trước chúng ta thấy một điều hơi là lạ, đó là file head[.]
LẬP TRÌNH C/C++ NÂNG CAO Yêu cầu trước đọc: học xong Lập trình C/C++ BÀI 6: TEMPLATE (TIẾP THEO) Trình biên dịch template Trong trước thấy điều lạ, file header array.h có thị #include file source array.cpp Tại ? Khi trình biên dịch gặp template, kiểm tra cú pháp, khơng biên dịch Ví dụ gặp template khơng thể biên dịch khơng biết kiểu liệu T Khi gặp instance template, ví dụ template biên dịch có phiên với kiểu liệu int template Khi gặp instance thứ hai template, ví dụ template lại biên dịch có phiên thứ hai template, phiên với kiểu liệu double Vân vân Thông thường viết định nghĩa lớp nguyên mẫu hàm lớp file header (đuôi h) viết thân cho hàm file source (đi cpp), mà file cpp include ln file header Template phải làm ngược lại Vì lí nói trên, định nghĩa lớp, nguyên mẫu hàm lẫn thân hàm lớp template phải biên dịch Do tách rời định nghĩa lớp template chứa file header riêng, file header phải include file source chứa thân hàm lớp template đó, file khác muốn dùng template phải include file header Ở cịn phần export, tơi cắt Có nhiều thứ sau tơi cắt đi, nhằm giảm tải cho chương trình xuống đến mức tối thiểu Nhưng an tâm thứ quan trọng có đầy đủ Dùng từ khóa nào, class hay typename Về bản, khác biệt chúng không rõ ràng, có ý nghĩa cho kết nhau, bạn muốn dùng từ khóa Nhưng có lúc bạn phải dùng từ khóa typename, ví dụ CODE templateclass Thing { T::SubType *ptr; }; Chúng ta muốn khai báo trỏ thuộc kiểu SubType T, C++ hiểu muốn nhân giá trị SubType kiểu T với ptr Lúc bắt buộc phải dùng từ khóa typename CODE templateclass Thing{ typename T::SubType *ptr; }; Chuyên môn hóa template (template specialization) Giả sử ta có lớp template templateclass pair{…} Khi ta tạo instance cách khai báo cụ thể kiểu T, ví dụ int, tức ta chun mơn hóa (specialization) lớp template pair myobject(155,36); Đơi ta muốn lớp template tạo instance cụ thể để thực công việc cụ thể riêng loại liệu cụ thể đó, ta dùng chun mơn hóa cụ thể (explicit specialization) Trong ví dụ ta muốn riêng kiểu liệu cụ thể int lớp template có hàm trả phần dư hai số nguyên, với kiểu liệu khác trả CODE template class pair { T value1, value2; public: pair(T first, T second) { value1=first; value2=second; } T module() {return 0;} }; //viết lại định nghĩa lớp chun mơn hóa cho kiểu liệu int template class pair { int value1, value2; public: pair(int first, int second) { value1=first; value2=second; } int module (); }; //hàm module dành riêng cho lớp chun mơn hóa template int pair::module() { return value1%value2; } int main() { pair myints(100,75); coutgetData();} bool endOfList(){return(current==0);} }; ... 0; } C? ??n phần nữa, cao dùng sau lập trình game, mà chủ yếu cho lập trình b? ?c thấp, phần c? ??ng, hệ điều hành, nên tơi bỏ, đủ nh? ?c đầu khó nhớ C? ?c b? ?c h? ?c xong template đó, nắm rõ tất kĩ thuật template. .. double C? ? c? ?ch xử lí chuyện C? ?ch 1: casting (ép kiểu) tham số max(static_cast(7), 5.2); //l? ?c T kiểu double, đối số kiểu double C? ?ch 2: explicit specialization (chun mơn hóa c? ?? thể) cho... }; Chun mơn hóa template (template specialization) Giả sử ta c? ? lớp template templateclass pair{…} Khi ta tạo instance c? ?ch khai báo c? ?? thể kiểu T, ví dụ int, t? ?c ta chun mơn hóa (specialization)