Menu
CoddyTech

Ôn tập: vùng chứa tổng quát

Thuộc phần Lập trình hướng đối tượng trong hành trình C++ của Coddy. Bài học 69 trên 104.

challenge icon

Thử thách

Dễ

Hãy xây dựng một mẫu lớp GenericContainer kết hợp mọi kiến thức bạn đã học về mẫu trong chương này. Bạn sẽ tạo một vùng chứa linh hoạt, an toàn về kiểu dữ liệu, có thể lưu trữ phần tử động và cung cấp các thao tác hữu ích bằng kỹ thuật mẫu.

Bạn sẽ sắp xếp code trong hai tệp:

  • GenericContainer.h: Định nghĩa mẫu lớp tại đây. GenericContainer cần:

    Lưu trữ phần tử động bằng con trỏ đến một mảng, đồng thời theo dõi kích thước hiện tại và sức chứa.

    Cung cấp các phương thức cốt lõi sau:

    • Hàm khởi tạo nhận sức chứa ban đầu
    • Hàm hủy giải phóng bộ nhớ động đúng cách
    • push(T value): thêm một phần tử vào vùng chứa, giả sử sức chứa luôn đủ cho thử thách này
    • get(size_t index): trả về phần tử tại chỉ số đã cho
    • getSize(): trả về số phần tử hiện tại

    Thêm một mẫu hàm có tên printContainer, nhận một GenericContainer<T>& và in ra mọi phần tử, cách nhau bằng dấu cách, sau đó xuống dòng.

    Tạo một chuyên biệt hóa mẫu của printContainer cho GenericContainer<bool>, để in ra true hoặc false thay vì 1 hoặc 0.

    Thêm một mẫu hàm biến thiên có tên pushAll, nhận một GenericContainer<T>& cùng với số lượng giá trị bất kỳ, rồi thêm lần lượt từng giá trị vào vùng chứa bằng biểu thức gấp.

  • main.cpp: Đọc năm đầu vào, mỗi đầu vào trên một dòng riêng:
    1. Số nguyên thứ nhất
    2. Số nguyên thứ hai
    3. Số nguyên thứ ba
    4. Một giá trị double
    5. Một giá trị boolean dưới dạng chuỗi (true hoặc false)

    Minh họa cách dùng vùng chứa bằng cách:

    1. Tạo một GenericContainer<int> có sức chứa 10
    2. Dùng pushAll để thêm cả ba số nguyên cùng lúc
    3. In kích thước: Int container size: <size>
    4. Gọi printContainer để hiển thị các số nguyên
    5. Tạo một GenericContainer<double> có sức chứa 5
    6. Thêm giá trị double và giá trị cố định 2.5 bằng các lần gọi push riêng lẻ
    7. Gọi printContainer để hiển thị các giá trị double
    8. Tạo một GenericContainer<bool> có sức chứa 5
    9. Thêm đầu vào boolean và giá trị cố định false
    10. Gọi printContainer để hiển thị các giá trị boolean, kết quả cần hiển thị true/false

Ví dụ, với các đầu vào 10, 20, 30, 3.14 và true:

Int container size: 3
10 20 30 
3.14 2.5 
true false 

Thử thách này kết hợp mẫu lớp cho vùng chứa, chuyên biệt hóa mẫu để tùy chỉnh cách in giá trị bool và mẫu biến thiên cho hàm pushAll linh hoạt. Vùng chứa tự quản lý bộ nhớ theo các nguyên tắc RAII, qua đó minh họa cách kết hợp mẫu với việc quản lý tài nguyên đúng cách.

Tự làm thử

#include <iostream>
#include <string>
#include "GenericContainer.h"

using namespace std;

int main() {
    // Đọc các giá trị đầu vào
    int num1, num2, num3;
    double doubleVal;
    string boolStr;
    
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> doubleVal;
    cin >> boolStr;
    
    // Chuyển chuỗi sang kiểu bool
    bool boolVal = (boolStr == "true");
    
    // TODO: Tạo GenericContainer<int> với sức chứa 10
    
    // TODO: Dùng pushAll để thêm cả ba số nguyên cùng lúc
    
    // TODO: In ra kích thước: "Int container size: <size>"
    
    // TODO: Gọi printContainer để hiển thị các số nguyên
    
    // TODO: Tạo GenericContainer<double> với sức chứa 5
    
    // TODO: Thêm giá trị double và 2.5 bằng hai lệnh gọi push riêng
    
    // TODO: Gọi printContainer để hiển thị các số thực
    
    // TODO: Tạo GenericContainer<bool> với sức chứa 5
    
    // TODO: Thêm giá trị đầu vào kiểu bool và false
    
    // TODO: Gọi printContainer để hiển thị các giá trị kiểu bool
    
    return 0;
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C++ online