Bài học theo mô-đun (2/2)
Mẫu lớp học
Cũng giống như hàm, các lớp cũng có thể được tham số hóa theo một hoặc nhiều kiểu dữ liệu. Điều này cho phép chúng tôi xác định các cấu trúc dữ liệu chung (chẳng hạn như danh sách, hàng đợi, ngăn xếp hoặc trình bao bọc) hoạt động với bất kỳ loại dữ liệu nào mà không cần sao chép mã.
Xác định mẫu lớp
Để khai báo mẫu lớp, chúng ta sử dụng cú pháp template <typename T> ngay trước định nghĩa lớp. Bên trong lớp, chúng ta có thể sử dụng tham số loại T để xác định biến thành viên, kiểu trả về hoặc tham số hàm thành viên.
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};Khởi tạo
Khi tạo một đối tượng của mẫu lớp, chúng ta phải chỉ định rõ ràng loại giữa các dấu ngoặc nhọn <> (mặc dù bắt đầu bằng C++17, trình biên dịch có thể suy ra nó trong một số ngữ cảnh thông qua _ Khấu trừ đối số mẫu lớp_ hoặc CTAD):
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleChuyên môn về mẫu
Đôi khi chúng ta muốn có một hành vi khác cho một mẫu lớp khi nó được khởi tạo bằng một kiểu cụ thể. Trong trường hợp này, chúng tôi xác định chuyên môn hóa tổng thể bằng cách sử dụng cú pháp template <> theo sau là định nghĩa lớp chỉ định loại mục tiêu:
// Total specialization for the bool type
template <>
class Box<bool> {
private:
bool value;
public:
Box(bool v) : value(v) {}
void printState() {
std::cout << (value ? "True" : "False");
}
};Hãy tự mình thử
Khai báo một mẫu lớp có tên Box chứa giá trị thành viên riêng có tên loại T, một hàm tạo khởi tạo nó và một phương thức công khai getValue() const trả về giá trị.
Hiển thị gợi ý
Hãy nhớ thêm `template <typename T>` vào phần khai báo lớp `Box`.
Giải pháp khả dụng sau 3 lần thử
Khai báo một mẫu lớp Wrapper<T> với dữ liệu thành viên công khai thuộc loại T, hàm tạo Wrapper(T d) và phương thức print() in dữ liệu ra std::cout. Tiếp theo, tạo một chuyên môn hóa tổng thể cho Wrapper<char> trong đó phương thức print() in ký tự được đặt trong dấu ngoặc đơn (ví dụ: 'A' thay vì A).
Hiển thị gợi ý
Sử dụng `mẫu <>` để biểu thị mức độ chuyên môn hóa tổng thể của `Wrapper<char>`.
Giải pháp khả dụng sau 3 lần thử