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 header array.h có
chỉ thị #include file source array.cpp. Tại sao như
vậy ?
Khi trình biên dịch gặp template, nó kiểm tra cú pháp, nhưng không biên
dịch ngay.
Ví dụ nó gặp template<class T> nó không thể biên dịch vì nó không biết
kiểu dữ liệu của T.
Khi nó gặp instance đầu tiên của template, ví dụ template<int> nó biên dịch
và chúng ta có phiên bản với kiểu dữ liệu int của
template.
Khi nó gặp instance thứ hai của template, ví dụ template<double> nó cũng
lại biên dịch và chúng ta có phiên bản thứ hai của
template, phiên bản với kiểu dữ liệu double. Vân vân.
Thông thường chúng ta viết định nghĩa lớp và nguyên mẫu các hàm của lớp
đó ở file header (đuôi .h) rồi mới viết thân cho các
hàm đó ở một file source (đuôi .cpp), mà file cpp này include luôn file header
đó.
Template phải làm ngược lại. Vì lí do nói trên, cả định nghĩa lớp, nguyên mẫu
các hàm lẫn thân của các hàm đó của một lớp
template phải được biên dịch cùng nhau. Do đó khi tách rời định nghĩa của
một lớp template ra chứa trong một file header riêng,
file header đó phải include file source chứa thân các hàm của lớp template
đó, rồi một file nào khác muốn dùng template đó phải
include cái file header đó.
Ở đây còn một phần nữa về export, tôi đã cắt đi. Có nhiều thứ sau này tôi
cũng sẽ cắt đi, nhằm giảm tải cho chương trình xuống
nguyên, còn với các kiểu dữ liệu khác thì nó trả về 0
CODE
template<class T>
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 chuyên môn hóa cho kiểu dữ liệu int
template<>
class pair<int> {
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 chuyên môn hóa
template<>
int pair<int>::module() {
return value1%value2;
}
int main() {
pair<int> myints(100,75);
cout<<myints.module()<<endl;
pair<float> myfloats(100.0,75.0);
dữ liệu đã biết
Đối số kiểu primitive, ví dụ kiểu int
CODE
template<typename T,int size>
class Array{
T* array;
public:
Array();
};
template<typename T,int size>Array<T,size>::Array(){
array = new T[size];
}
int main(){
Array<string,5> a;
return 0;
}
Đối số là một lớp template khác
CODE
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class Array
{
T* array;
public:
Array();
};
template<typename T>Array<T>::Array()
{