6 .2| Khuôn mẫu lớp
6.2 .1| Khái niệm về Lớp template
Lớp template được sử dụng rộng rãi trong c++ bởi có nhiều lớp có chung các phương thức và dữ liệu nhưng chúng chỉ khác nhau kiêu dữ liệu cho các biến thành viên.
Các lớp template được gọi là các kiểu có tham số bởi vì chúng địi hỏi một hoặc nhiều tham số để mô tả, làm thế nào tùy chỉnh một lớp template chung để tạo thành một lớp template cụ thể.
Cú pháp khai báo lớp template:
template <class T> class Tenlop
{
// thành phần trong lớp }
// định nghĩa các phương thức trong lớp
template <class T>
<Kiểu trả về> Tenlop <T>:: Tênhàm (các tham số) {
//Nội dung phương thức }
Khác với việc sử dụng mẫu hàm, khi chúng ta sử dụng các lớp template được tổng quát hóa, chúng ta phải sử dụng tường minh kiểu dữ liệu cần sử dụng. Đối với ngơn ngữ c++, khi biên dịch chương trình có sử dụng mẫu hàm hay lớp được tổng qt hóa kiểu dữ liệu, trình biên dịch sẽ kiểm tra xem chương trình
Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 134
dùng hàm hay lớp đó với kiểu dữ liệu cụ thể nào. Trình biên dịch sẽ tự động phát sinh mã nguồn tương ứng cho các kiểu dữ liệu mà chương trình sử dụng.
Việc tổng qt hóa kiểu dữ liệu cho hàm và lớp sẽ làm giảm thời gian và cơng sức trong q trình cài đặt chương trình và dẽ dàng trong việc bảo trì do chúng ta cài đặt hàm hay lớp với kiểu dữ liệu tổng quát chung.
Ví dụ 3: Cài đặt và sử dụng lớp Stack template <class T> class Stack { private: int Size; int Top; T *StackPtr; public: Stack (int =10); ~Stack() { delete[] StackPtr; }
int Push(const T&); int Pop(T&);
int IsEmpty()const
{
return Top ==-1;
}
int IsFull() const
{ return Top==Size-1; } }; template<class T> Stack<T>::Stack(int S) { Size = (S > 0 && S < 1000) ? S : 10; Top = -1;
StackPtr = new T[Size]; }
template<class T>
int Stack<T>::Pop(T &PopValue)
{ if (!IsEmpty()) { PopValue = StackPtr[Top--]; return 1; } return 0; } template<class T>
Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 135 { if(!IsFull()) { StackPtr[++Top]= Item; return 1; } return 0; } int main() {
Stack<float> FloatStack(5); // sử dụng kiểu dữ liệu tường minh cho lớp Stack là float.
float F = 1.1;
cout << "Pushing elements onto FloatStack" << endl; while (FloatStack.Push(F))
{
cout << F << ' '; F += 1.1;
}
cout << endl << "Stack is full. Cannot push " << F << endl << endl << "Popping elements from FloatStack" << endl; while (FloatStack.Pop(F))
cout << F << ' ';
cout << endl << "Stack is empty. Cannot pop" << endl; Stack<int> IntStack;
int I = 1;
cout << endl << "Pushing elements onto IntStack" << endl; while (IntStack.Push(I))
{
cout << I << ' '; ++I ;
}
cout << endl << "Stack is full. Cannot push " << I << endl << endl << "Popping elements from IntStack" << endl; while (IntStack.Pop(I))
cout << I << ' ';
cout << endl << "Stack is empty. Cannot pop" << endl; system("pause"); return 0; } Ví dụ 4: Cài đặt lớp Phanso template<class T> class Phanso { private: T tuso; T mauso; public: void Nhap(); void Xuat(); };
Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 136
// dinh nghia phuong thuc nhap va xuat //dinh nghia ham nhap
template<class T>
void Phanso<T>::Nhap()
{
// nhap vao tu so
cout<<"\n Nhap vao tu so:"; cin>>tuso;
// nhap vao mau so
cout<<"\n Nhap vao mau so:"; cin>>mauso;
}
// dinh nghia ham Xuat
template<class T>
void Phanso<T>::Xuat()
{
cout<<tuso <<"/"<<mauso;
//Xuat tu so va mau so-
} void main() { Phanso<int> n; n.Nhap(); n.Xuat(); system("pause"); }