C++primer第五版的Sales_data程序(版本V2.0)

相对于V1.0,有如下改动:
1.由struct类型替换成了class类型并进行封装
2.添加了新的接口函数add()

3.将接口函数更改为Sales_data的友元函数
4.添加了能够使Sales_data进行初始化的构造函数

#include<iostream>
#include<string>
#include<Windows.h>
using namespace std;
class Sales_data {
	friend istream &read(istream&, Sales_data&);
	friend ostream &print(ostream&, Sales_data&);
	friend Sales_data add(Sales_data&, Sales_data&);
public:
	Sales_data() = default;
	Sales_data(const string &s) :bookNo(s) {};
	Sales_data(const string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(p) {};
	Sales_data(istream &is) { read(is, *this); }
	Sales_data& Sales_data::combine(const Sales_data &rhs) {
		units_sold += rhs.units_sold;
		revenue += rhs.revenue;
		return *this;
	}
	string Sales_data::isbn() const { return bookNo; }
private:
	double Sales_data::avg_price() const { return units_sold ? revenue / units_sold : 0; }
	unsigned units_sold = 0;
	double revenue = 0.0;
	string bookNo;
};
istream &read(istream &div, Sales_data& a)
{
	double price = 0;
	div >> a.bookNo >> a.units_sold >> price;
	a.revenue = price*a.units_sold;
	return div;
}
ostream &print(ostream &div, Sales_data& a)
{
	div << a.bookNo << " " << a.units_sold << " " << a.revenue << " " << a.avg_price();
	return div;
}
Sales_data add(Sales_data &a, Sales_data &b)
{
	Sales_data c = a;
	if (a.isbn() == b.isbn())
	{
		c.combine(b);
	}
	return c;
}
int main()
{
	Sales_data total(cin);//使用istream为参数的构造函数初始化total
		Sales_data trans;
		while (read(cin, trans)) {
			if (total.isbn() == trans.isbn())
				total.combine(trans);
			else {
				print(cout, total);
				cout << endl;
				total = trans;
			}
		}
		print(cout, total);
		cout << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42426141/article/details/81002963