回顾:泛型容器
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 69 课,共 104 课。
挑战
简单让我们创建一个 GenericContainer 类模板,把你在本章学到的所有模板知识结合起来。你将创建一个灵活且类型安全的容器,它可以动态存储元素,并通过模板技术提供实用的操作。
你需要将代码分别写在两个文件中:
GenericContainer.h:在这里定义类模板。你的GenericContainer应该:使用指向数组的指针动态存储元素,并跟踪当前大小和容量。
提供以下核心方法:
- 接收初始容量的构造函数
- 能正确清理动态内存的析构函数
push(T value):向容器添加一个元素(本挑战中,假设容量始终足够)get(size_t index):返回给定索引处的元素getSize():返回当前元素数量
添加名为
printContainer的函数模板,接收一个GenericContainer<T>&,并打印所有元素,元素之间用空格分隔,最后换行。为
GenericContainer<bool>创建printContainer的模板特化版本,打印true或false,而不是1或0。添加名为
pushAll的可变参数函数模板,接收一个GenericContainer<T>&和任意数量的值,并使用折叠表达式将每个值推入容器。main.cpp:读取五个输入(每个输入各占一行):- 第一个整数
- 第二个整数
- 第三个整数
- 一个 double 值
- 一个以字符串形式表示的布尔值(
true或false)
通过以下操作演示你的容器:
- 创建一个容量为 10 的
GenericContainer<int> - 使用
pushAll一次性添加三个整数 - 打印大小:
Int container size: <size> - 调用
printContainer显示这些整数 - 创建一个容量为 5 的
GenericContainer<double> - 分别调用
push,推入 double 值和字面值2.5 - 调用
printContainer显示这些 double 值 - 创建一个容量为 5 的
GenericContainer<bool> - 推入布尔输入值和字面值
false - 调用
printContainer显示这些布尔值(应显示true/false)
例如,输入 10、20、30、3.14 和 true 时:
Int container size: 3
10 20 30
3.14 2.5
true false 这个挑战结合了用于容器的类模板、用于自定义布尔值打印的模板特化,以及用于实现灵活 pushAll 函数的可变参数模板。你的容器遵循 RAII 原则管理自身内存,展示了模板如何与恰当的资源管理相结合。
亲手试试
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// 读取输入
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// 将字符串转换为 bool
bool boolVal = (boolStr == "true");
// TODO: 创建容量为 10 的 GenericContainer<int>
// TODO: 使用 pushAll 一次性添加 3 个整数
// TODO: 输出大小:"Int container size: <size>"
// TODO: 调用 printContainer 显示整数
// TODO: 创建容量为 5 的 GenericContainer<double>
// TODO: 分别调用 push,添加 double 值和 2.5
// TODO: 调用 printContainer 显示 double 值
// TODO: 创建容量为 5 的 GenericContainer<bool>
// TODO: 添加布尔输入值和 false
// TODO: 调用 printContainer 显示布尔值
return 0;
}
面向对象编程中的所有课
自己练习: C++ 在线编译器