BÀI 4: TEMPLATE
Hàm template
Giả sử chúng ta cần viết một hàm trả về số nguyên lớn nhất giữa 2 số
CODE
int maximum(int a,int b) {
return (a>b)?a:b; }
Rồi đến số thực chúng ta cũng làm như vậy
CODE
double maximum(double a,double b) {
return (a>b)?a:b; }
Rồi giả sử như với lớp Person chúng ta cũng phải làm như vậy (toán tử > đã được overload)
CODE
Person maximum(Person a,Person b) {
return (a>b)?a:b; }
C++ cung cấp một giải pháp cho vấn đề này, đó là template
CODE
template<class T>T maximum(T a,T b) {
return (a>b)?a:b; }
int main() {
int a=7;int b=5;
cout<<maximum(a,b); return 0
}
template với nhiều hơn một kiểu dữ liệu
CODE
template<class T,typename U>void func(T a,U b); Dùng template với mảng
CODE
template<class T,int size>void print(T (&a)[size]) {
for(int i=0;i<size;i++) cout<<a[i]<<endl; }
Lớp template (template class) CODE
template<class T>class pair {
T values[2]; public:
pair(T first,T second) { values[0]=first; values[1]=second; } T getmaximum(); }; template<class T>T pair<T>::getmaximum() {
return (values[0]> values[1])? values[0]: values[1]; }
Trong hàm main
pair<int> myobject(155,36); myobject.getmaximum();
Thật tuyệt, đúng không ?
Vấn đề không đơn giản như vậy.
Đau đầu
Xem lại hàm template dưới đây
CODE
template<class T>T maximum(T a,T b) {
return (a>b)?a:b; }
Ví dụ dưới đây thực ra là đang so sánh địa chỉ bộ nhớ (memory address) của 2 biến a và b
CODE
char* a = "hello";char* b = "world"; cout<<maximum(a,b);
Ví dụ dưới đây cũng là đang so sánh địa chỉ bộ nhớ (memory address) của 2 biến a và b
div, id: post-25916, class: postcolor
CODE int a[3],b[3];
cout<<maximum(a,b);
Vậy phải làm sao ?
(Trong lập trình, những vấn đề tưởng như nhỏ nhặt thế này thực ra gây đau đầu lắm đó, nhất là khi phải làm dự án từ 1000 words trở lên. Mà đặc biệt riêng lập trình game đụng những chuyện đau đầu này thường xuyên
hơn các phân ngành IT khác. Biên dịch thành công, mà tại sao nó … kì cục
vầy nè ?)
Cứu tinh xuất hiện, đó _______________là một tham chiếu mà tham chiếu đến
một con trỏ (a reference which refers to a pointer). Đây là dạng đau đầu nhất của tham chiếu.
A reference which refers to a pointer CODE
int* p; //một con trỏ p bình thường
r = new int; //tương đương với p = new int *r = 5; //tương đưong với *p = 5
cout<<*p; //tương đương với cout<<*r
Và như vậy, vấn đề khó khăn với dữ liệu kiểu mảng đã được giải quyết.
CODE
template<class T>T* maximum(T*& a,T*& b) { return (*a>*b)?a:b; } int main() { char* a="bb"; char* b="aa"; cout<<maximum(a,b); return 0; }
Lưu ý là chỉ có "một tham chiếu mà tham chiếu đến một con trỏ" và "một con trỏ mà trỏ đến một con trỏ khác", chứ không thề có những khái niệm như "một tham chiếu mà tham chiếu đến một tham chiếu khác" hay "một con trỏ mà trỏ đến một tham chiếu" đâu nhá.
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 5: TEMPLATE (TIẾP) part 1