Phải xác định một kiểu dữ liệu cụ thể được lưu trong stack.. Khuôn hình lớp …[r]
(1)(2)Nội dung chính
Khn hình cho phép xây dựng hàm
và lớp tổng quát
(3)1 Định nghĩa khn hình
Template cho phép định nghĩa hàm có đặc điểm chung C++ sử dụng template để tạo thể cụ thể
hàm cần thiết
Ví dụ: định nghĩa hàm max
template<class kind>
kind max(kind d1, kind d2) {
if (d1 > d2)
return (d1); return (d2);
}
Cấu trúc <class kind> báo cho C++ biết kind
(4)Định nghĩa khn hình…
Ví dụ: Sử dụng template
main() {
float f = max(3.5, 8.7); int i = max(100, 800); char ch = max('A', 'Q'); int i2 = max(600, 200); }
Khi C++ phát câu lệnh: float f = max(3.5, 8.7);
kiểm tra để xác định xem hàm max(float, float) có mã lệnh hay chưa tự động tạo mã lệnh chưa có
Chú ý gặp câu lệnh int i2 = max(600, 200);
(5)Chun biệt hố hàm
Khi sử dụng hàm max để so sánh hai string sau:
main() {
char *namel = "Able"; char *name2 = "Baker";
cout << max(namel, name2) << '\n';
}
Vì string biểu diễn trỏ (char *), nên câu
lệnh if (dl > d2) so sánh giá trị trỏ nội dụng trỏ
Mà ta muốn C++ sử dụng cách so sánh với
(6)Chuyên biệt hoá hàm …
Thực trình chun biết hố (specialization)
Ta định nghĩa lại hàm max dùng cho kiểu string.
char *max(char *dl, char *d2)
{
if (strcmp(dl, d2) < 0) return (dl); return (d2);
}
Khi C++ phát câu lệnh cout << max(namel, name2) << '\n';
(7)2 Khn hình lớp
#include <stdlib.h> #include <iostream.h>
const int STACK_SIZE = 100; // số lượng phần tử lớn Stack template<class kind>
class stack { private:
int count; // Số lượng phần tử Stack
kind data[STACK_SIZE]; // Mảng chứa phần tử Stack public:
stack (void) {count = 0; // Stack ban đầu rỗng} void push(const kind item) {
data[count] = item; ++count;
}
kind pop(void) { count;
(8)Khn hình lớp …
Nếu ta khai báo:
stack a_stack; // câu lệnh không hợp lệ Stack template chung
Khi C++ nhìn thấy lệnh khai báo này, hỏi “stack
nào?”
Phải xác định kiểu liệu cụ thể lưu stack Phải khai báo:
stack<int> a_stack; // Các phần tử stack kiểu số nguyên Sau đó, ta sử dụng stack sau:
(9)Khn hình lớp …
Định nghĩa hàm thành phần bên
ngoài định nghĩa lớp sau:
template<class kind>
inline void stack<kind>::push(const kind item) {
data[count] = item; ++count;
(10)Chuyên biệt hoá lớp
template <class kind>stack { }
Giới thiệu cho C++ biết cách tạo tập lớp có tên
stack<int>, stack<double>, stack<float>,…
C++ tự động tạo hàm thành viên như: stack<int>:
:push, stack<double>: :push, stack<float>::push
Nếu khai báo hàm thành viên cách tường minh C+
+ sử dụng định nghĩa trước
inline void stack<char *>::push(const char * item) {
data[count] = strdup(item); ++count;
}
Từ khố template nói cho C++ biết ”Đây class chung, tạo
một phiên tương ứng với nó”
Nếu khơng có từ khố template, C++ hiểu hàm