Yêu cầu trước khi đọc: học xong Lập trình C/C++ căn bản BÀI 4: TEMPLATE

Một phần của tài liệu LẬP TRÌNH C/C++ NÂNG CAO potx (Trang 26 - 30)

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

Một phần của tài liệu LẬP TRÌNH C/C++ NÂNG CAO potx (Trang 26 - 30)

Tải bản đầy đủ (PDF)

(111 trang)