仅仅记录贴,按书上的做完了一边,想把private分离出来已经很难了。因为is用到的成员变量都是直接当做public使用的,如果要改的话可以考虑存储输入,让后用构造函数对类进行初始化。
#include<iostream> using namespace std; class Sales_data{ public: string bookNo; unsigned unit_sold; double revenue; string isbn()const {return this->bookNo; } double avg_price()const; Sales_data &combine(const Sales_data&); Sales_data(istream &is); //友元函数 friend Sales_data add(const Sales_data& ls,const Sales_data& rs); }; Sales_data add(const Sales_data& ls,const Sales_data& rs) { Sales_data sum = ls; sum.combine(rs); return sum; } //返回的值是对ostream的引用 ostream &print(ostream& os,const Sales_data &item){ os<<item.isbn()<<endl <<item.unit_sold<<endl <<item.revenue<<endl; return os; } istream &read(istream & is,Sales_data &item){ double price = 0; is>>item.bookNo >>item.unit_sold >>price; item.revenue = price * item.unit_sold; return is; } double Sales_data::avg_price()const{ if(revenue)return revenue/unit_sold; else return 0; } Sales_data& Sales_data::combine(const Sales_data& rhs){ // this->revenue = this->revenue + rhs.revenue; this->revenue += rhs.revenue; this->unit_sold += rhs.unit_sold; return *this; } //外部定义构造函数 Sales_data::Sales_data(istream &is) { read(is,*this); } int main(){ return 0; }