练习7.6:
#include <iostream>
using namespace std;
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
Sales_data sum = lhs;
sum.combine(rhs);
return sum;
}
std::istream &read(std::istream &is ,Sales_data &item)
{
is>>item.bookNo>>item.units_sold>>item.sellingprice>>item.saleprice;
return is;
}
std::ostream &print(std::ostream &os,const Sales_data &item)
{
os<<item.isbn()<<" "<<item.units_sold<<" "<<item.sellingprice<<" "<<item.saleprice
<<" "<<item.discount;
return os;
}
练习7.7:
#include <iostream>
#include "Sales_data.h"
using namespace std;
int main()
{
cout<<"请输入交易记录(ISBN,销售额,原价,实际售价):"<<endl;
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);
cout<<endl;
total = trans;
}
}
print(cout,total);
cout<<endl;
}
else
{
cerr<<"No data?!"<<endl;
return -1;
}
return 0;
}
练习7.8:
read函数将其Sales_data参数定义成普通的引用是因为我们需要从标准输入流中读取数据并将其写入到给定的Sales_data对象,因此需要有修改对象的权限。而print将其参数定义成常量引用是因为它只负责数据的输出,不对其做任何更改。
练习7.9:
#include <iostream>
#include <string>
using std::string;
class Person {
private:
string strName;
string strAddress;
public:
string getName()const {
return strName;
}
string getAddress() const {
return strAddress;
}
std::istream &read(std::istream&is,Person &per)
{
is>>per.strName>>per.strAddress;
return is;
}
std::ostream &print(std::ostream &os,const Person &per)
{
os<<per.getName()<<per.getAddress();
return os;
}
};
练习7.10:
【出题思路】
read函数的返回类型是std::istream &,体会这里使用引用的作用。
【解答】
因为read函数的返回类型是引用,所以read(cin, data1)的返回值可以继续作为外层read函数的实参使用。该条件检验读入data1和data2的过程是否正确,如果正确,条件满足;否则条件不满足。