练习12:使用对象数组管理商品¶
任务描述¶
设计商品类 Product,使用对象数组保存多件商品的信息,并实现输出商品清单和计算商品总价的功能。
本题重点练习对象数组的列表初始化、通过下标访问数组元素,以及将对象数组传递给普通函数。
相关知识¶
对象数组的创建¶
对象数组的每个元素都是一个独立对象。若类提供带参构造函数,可以在列表初始化时为每个元素提供构造参数:
数组创建时,会依次调用每个元素对应的构造函数。
遍历对象数组¶
使用下标访问对象数组中的元素,再通过 . 调用对象的公有成员函数:
将数组传递给函数¶
数组作为函数参数时通常会退化为指针,因此需要额外传入元素个数。若函数不修改数组元素,应使用 const 修饰参数:
编程要求¶
- 使用 C++11 标准编写程序。
- 在
Product.h中声明Product类,私有数据成员包括商品名称和单价:
- 声明并实现以下公有成员函数:
Product(const std::string& name, double price);
const std::string& GetName() const;
double GetPrice() const;
- 在
Product.h中声明普通函数:
void PrintProducts(const Product products[], std::size_t count);
double CalculateTotal(const Product products[], std::size_t count);
PrintProducts按“商品名 单价”的格式逐行输出对象数组中的全部商品,单价固定保留两位小数。CalculateTotal返回数组中所有商品单价之和。- 在
main.cpp中创建包含 3 个Product对象的数组,使用assert验证总价,并捕获PrintProducts输出后断言其格式。
待完成代码¶
Product.h¶
#ifndef PRODUCT_H
#define PRODUCT_H
#include <cstddef>
#include <string>
// TODO:声明 Product 类和两个普通函数
#endif
Product.cpp¶
main.cpp¶
#include "Product.h"
#include <cassert>
#include <iostream>
#include <sstream>
void test() {
Product products[] = {
Product("笔记本", 12.50),
Product("水杯", 35.00),
Product("书包", 89.50)
};
const std::size_t count = sizeof(products) / sizeof(products[0]);
assert(CalculateTotal(products, count) == 137.00);
std::ostringstream output;
std::streambuf* oldBuffer = std::cout.rdbuf(output.rdbuf());
PrintProducts(products, count);
std::cout.rdbuf(oldBuffer);
assert(output.str() ==
"笔记本 12.50\n"
"水杯 35.00\n"
"书包 89.50\n");
}
int main() {
test();
std::cout << "本关测试通过" << std::endl;
return 0;
}
测试说明¶
对象数组中共有三件商品,预期总价为 12.50 + 35.00 + 89.50 = 137.00。输出应为:
可使用以下命令编译三个文件:
开始你的任务吧,祝你成功!