只是在前边程序的基础上简单的进行了改动,值得注意的是要在类内声明read函数,要不然会报错
慢慢来,会好的
#include<iostream>
#include<string>
using namespace std;
struct Sales_data
{
//新增构造函数
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*n) {};
//构造函数初始值列表(冒号和花括号之间)
//Sales_data(istream &);
istream &read(istream&, Sales_data&);//需要在类内声明read,否则会报错:read,找不到标识符
Sales_data(istream &is)
{
read(is, *this);
}
string isbn() const
{
return bookNo;
}
Sales_data& combine(const Sales_data&);
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
Sales_data add(const Sales_data&, const Sales_data&);
ostream &print(ostream&, const Sales_data&);
//istream &read(istream&, Sales_data&);
istream &read(istream&is, Sales_data&item)//read在读取和写入的过程中不断修改数据,不能是常量引用
{
double price = 0.0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}
ostream &print(ostream &os, const Sales_data &item)//输出的时候不需要改变数据,可以使用常量引用
{
os << item.isbn() << " " << item.units_sold << " " << item.revenue;
return os;
}
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs;
sum.combine(rhs);
return sum;
}
Sales_data &Sales_data::combine(const Sales_data &temp)
{
units_sold += temp.units_sold;
revenue += temp.revenue;
return *this;
}
int main()
{
Sales_data total;
if (read(cin, total))
{
Sales_data trans;
while (read(cin, trans))
{
if (total.isbn() == trans.isbn())//
{
total = add(total, trans);//
}
else
{
print(cout, total) << endl;
total = trans;
}
}
print(cout, total) << endl;
}
else
{
cerr << "No data?!" << endl;
return -1;
}
system("pause");
return 0;
}