C++ Primer 第五版中的Sales_data类---用来模拟Sales_item类的实现

       最近又在复习C++, 看到C++ Primer第五版, 感觉很好, 各种讲述很是引人入胜。 作者先讲述了int的情况, 然后抽象地讲述了Sales_item类, 然后企图用Sales_data类的实现过程来逐步介绍Sales_item类的实现, 逻辑很清晰。 下面, 我们来直接看一下Sales_data类(说明: 我有裁剪和修改):

 

#include <iostream>
#include <string>
using namespace std;

class Sales_data
{
	// 声明友元函数
	friend ostream &print(ostream&, const Sales_data&);
	friend istream &read(istream&, Sales_data&);

public:

	// 构造函数
    Sales_data()
		:bookNo(""), units_sold(0), revenue(0.0) 
	{
	
	}

	// 读取到当前对象中
    Sales_data(istream &is)
	{
		read(is, *this);	
	}
		
	// 返回isbn编号
    string isbn() const 
	{
		return bookNo;
	}

	// 返回当前对象的引用
    Sales_data& combine(const Sales_data& rhs)
	{
		units_sold += rhs.units_sold;
		revenue += rhs.revenue;
		return *this;
	}

	// 均价
    double avg_price() const
	{
		if (units_sold)
		{
			return revenue / units_sold;
		}
		
		return 0;	
	}

private:
    string bookNo; // isbn号码
    unsigned units_sold; // 卖了多少册
    double revenue; // 总收益
};


// 友元函数:传入一个istream对象cin, 一个Sales_data对象, 返回一个istream对象的引用cin, 便于连输输入
istream& read(istream &is, Sales_data &item)
{
    double price = 0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = price * item.units_sold;

    return is;
}


// 友元函数:传入一个ostream对象cout, 一个Sales_data对象, 返回一个ostream对象的引用cout, 便于链式输出
ostream& print(ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " "
	   << item.revenue << " " << item.avg_price();

    return os;	
}


int main()
{
	Sales_data total;
	if (read(cin, total))  // 读取对象数据, 存入total中, 并返回cin 
	{
		Sales_data trans;
		while(read(cin, trans))  // 读取对象数据, 存入trans中, 并返回cin 
		{
			if (total.isbn() == trans.isbn()) // 判断当前isbn和前一个isbn是否相等
			{
				total.combine(trans);  // 加到当前对象total中
			}
			else 
			{
				print(cout, total) << endl; // 输出当前对象
				total = trans;  // 更新当前对象
			}
		}

		print(cout, total) << endl; // 输出当前对象(最后的对象)
	}
	else 
	{                    
		cerr << "No data?!" << endl; // 最开始就读取失败
	}

	return 0;
}

      一切尽在程序中, 不需要多说。
 

 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值