Chuyển đến nội dung chính
Mô-đun 8 · Bài học 2 trong tổng số 218/18 trong khóa học~15 min
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.

C++
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):

C++
Box<int> intBox(10);        // T becomes int
Box<double> doubleBox(3.14); // T becomes double

Chuyê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:

C++
// 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ử

tập thể dục#cpp.m8.l2.e1
Nỗ lực: 0Đang tải…

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ị.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#cpp.m8.l2.e2
Nỗ lực: 0Đang tải…

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).

Đang tải trình chỉnh sử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ử