Thứ Tư, 8 tháng 6, 2016

Hàm templateGiả 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ốCODEint 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
CODE
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
int*& r = p; //tham chiếu r là nickname mới của p
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á.
Hết khó khăn chưa ? Chưa đâu.

0 nhận xét:

Đăng nhận xét

Categories

Sample Text

Được tạo bởi Blogger.

Must Read

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Popular Posts

Video

Popular Posts

Our Facebook Page