Ô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.
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.GenericContainercầ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àyget(size_t index): trả về phần tử tại chỉ số đã chogetSize(): 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ộtGenericContainer<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
printContainerchoGenericContainer<bool>, để in ratruehoặcfalsethay vì1hoặc0.Thêm một mẫu hàm biến thiên có tên
pushAll, nhận mộtGenericContainer<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:- Số nguyên thứ nhất
- Số nguyên thứ hai
- Số nguyên thứ ba
- Một giá trị double
- Một giá trị boolean dưới dạng chuỗi (
truehoặcfalse)
Minh họa cách dùng vùng chứa bằng cách:
- Tạo một
GenericContainer<int>có sức chứa 10 - Dùng
pushAllđể thêm cả ba số nguyên cùng lúc - In kích thước:
Int container size: <size> - Gọi
printContainerđể hiển thị các số nguyên - Tạo một
GenericContainer<double>có sức chứa 5 - Thêm giá trị double và giá trị cố định
2.5bằng các lần gọipushriêng lẻ - Gọi
printContainerđể hiển thị các giá trị double - Tạo một
GenericContainer<bool>có sức chứa 5 - Thêm đầu vào boolean và giá trị cố định
false - 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
1Nền tảng về OOP
Tệp bên ngoàiBiên dịch và tạo bản dựng C++Tệp header và tệp nguồnNamespace và phạm viGiới thiệu về OOP trong C++Lớp và đối tượngCon trỏ thisPhương thức (hàm thành viên)Thuộc tính (dữ liệu thành viên)Cơ bản về hàm khởi tạo và hàm hủyÔn tập: máy tính đơn giản4Thuộc tính của lớp
Thành viên đối tượng và thành viên tĩnhHàm truy xuất và hàm thiết lậpHàm thành viên hằngTừ khóa mutablePhương thức và biến tĩnhHàm và lớp bạnÔn tập: Trình quản lý tài khoản ngân hàng7Kế thừa
Kế thừa cơ bảnMức truy cập trong kế thừaThứ tự gọi hàm khởi tạo và hàm hủyGhi đè phương thứcHàm ảo và VTableĐa kế thừaKế thừa ảoÔn tập: hệ phân cấp nhân viên2Quản lý bộ nhớ
Bộ nhớ ngăn xếp và heapCon trỏ và tham chiếuBộ nhớ động (new/delete)Con trỏ thông minh trong C++RAII trong C++Ôn tập: Trình quản lý mảng động5Tính đóng gói
Phạm vi truy cập trong C++Tìm hiểu sâu về phạm vi truy cậpẨn thông tinStruct và lớpLớp lồng nhau và lớp bên trongÔn tập: hệ thống hồ sơ sinh viên8Đa hình
Đa hình lúc biên dịch và khi chạyNạp chồng hàmÔn lại hàm ảoHàm ảo thuần túyLớp trừu tượngThiết kế interface trong C++Ép kiểu động và RTTIÔn tập: Máy tính hình học3Hàm khởi tạo và hàm hủy
Hàm khởi tạo mặc địnhHàm khởi tạo có tham sốHàm khởi tạo sao chépHàm khởi tạo di chuyểnDanh sách khởi tạoHàm khởi tạo ủy quyềnTìm hiểu sâu về hàm hủyQuy tắc 3 / 5 / 0Ôn tập: lớp chuỗi6Nạp chồng toán tử
Giới thiệu về nạp chồng toán tửNạp chồng toán tử số họcNạp chồng toán tử so sánhToán tử luồngNạp chồng toán tử gánNạp chồng toán tử [] và ()Toán tử chuyển đổi kiểuÔn tập: lớp ma trận9Mẫu
Mẫu hàmMẫu lớpChuyên biệt hóa mẫuMẫu biến tham sốCơ bản về SFINAE và đặc điểm kiểuÔn tập: vùng chứa tổng quátTự luyện tập: Trình biên dịch C++ online