c++ primer中定义sales_data类,整个书店程序如下

自己也是c++初学者,刚开始对书中第七章中给出的代码看不懂,自己学的时候也是云里雾里的,今天用了小上午的时间把书中的代码整个敲出来。

main.cpp代码如下:

//本程序将令sales_data类支持与sales_item类完全一样的操作集合
//sales_data的接口应该包括以下操作
//一个isbn成员函数,用于返回对象的ISBN编号
//一个combine成员函数,用于将一个sales_data对象加到另一个对象上
//一个add的函数,执行两个sales_data对象的加法
//一个read函数,将数据从istream读入到sales_data对象中
//一个print函数,将sales_data对象的值输出到ostream中
#include<iostream>
#include"sales_data.h"
using namespace std;
int main()
{
	sales_data total,s;

	if (read(cin, total))
	//if (cin >> total)
	{
		sales_data trans;
		while (read(cin, trans))
		//while (cin >> trans)
		{
			if (total.isbn() == trans.isbn())
			{
				cout << add(total, trans) << endl;
			}
			else
			{
				cout << "您输入的两本书编号不同" << endl;
				cout << total << endl;
				cout << trans << endl;
			}
		}
	}
	else
	{
		cout << "没有输入:" << endl;
	}

	return 0;
}


sales_data.h代码如下:

//本程序将令sales_data类支持与sales_item类完全一样的操作集合
//sales_data的接口应该包括以下操作
//一个isbn成员函数,用于返回对象的ISBN编号
//一个combine成员函数,用于将一个sales_data对象加到另一个对象上
//接口函数
//一个add的函数,执行两个sales_data对象的加法
//一个read函数,将数据从istream读入到sales_data对象中
//一个print函数,将sales_data对象的值输出到ostream中

#ifndef SALES_DATA_H
#define SALES_DATA_H

#include<iostream>
#include<string>
using namespace std;
class sales_data
{
private:
	string bookno;//书号
	double units_sold;//销售出的册数
	double price;//单本售价
	double revenue;//总销售额
	double average;

public:
	sales_data();//声明一个无参的构造函数
	sales_data(string b, int u, double p) :bookno(b), units_sold(u), price(p){}//声明一个有参数的默认构造函数,用参数的初始化表对数据成员初始化
	friend istream& operator >> (istream &, sales_data &);//运算符>>重载为友元函数
	friend ostream& operator << (ostream &, sales_data &);//运算符<<重载为友元函数
	friend sales_data operator + (sales_data & lhs, sales_data & rhs);//声明有元的运算符重载 + 函数
	sales_data& operator = (const sales_data &);//重载赋值运算符
	friend bool operator == (sales_data &, sales_data &);//声明有元的重载双目运算符==函数
	sales_data & operator += (const sales_data &);//声明一个返回sales_item类型的重载运算符+=函数,形参采用常量引用
	double avg_price();
	string isbn() const;//声明isbn函数,并返回书籍号
	//一个combine成员函数,用于将一个sales_data对象加到另一个对象上
	sales_data& combine(const sales_data &);
	//声明sales_data类的非成员接口函数
	//一个read函数,将数据从istream读入到sales_data对象中
	friend istream & read(istream &,sales_data &);//声明一个read函数,函数返回类型为istream &
	//一个add的函数,执行两个sales_data对象的加法
	friend sales_data add(const sales_data &, const sales_data &);

};
sales_data::sales_data()//定义无参数的构造函数
{
	bookno = "null";
	units_sold = 0;
	price = 0.0;
}

istream& operator >>(istream &input, sales_data &s)//对重载运算符>>进行定义
{
	input >> s.bookno >> s.units_sold >> s.price;
	if (input)
	{
		s.revenue = s.units_sold * s.price;
	}
	return input;
}
ostream& operator << (ostream &output, sales_data &s)//对重载运算符<<进行定义
{
	//output << s.bookno << " "<< s.units_sold << " " << s.revenue << " " << s.price << endl;
	output << s.bookno << " " << s.units_sold << " " << s.revenue << " " << s.avg_price() << endl;
	return output;
}
//将两个sales_item对象相加时,程序应该检测其两个对象的isbn书号是否相同
sales_data operator + (sales_data & lhs, sales_data & rhs)//定义重载运算符+函数,lhs和rhs是sales_item的对象
{
	sales_data ret;
	ret.bookno = lhs.bookno;
	ret.units_sold = lhs.units_sold + rhs.units_sold;
	ret.revenue = lhs.revenue + rhs.revenue;
	ret.avg_price();
	return ret;
}
bool operator == (sales_data &lhs, sales_data &rhs)
{
	return lhs.units_sold == rhs.units_sold && lhs.price == rhs.price && lhs.isbn() == rhs.isbn();
}
sales_data& sales_data:: operator = (const sales_data &lhs)//重载赋值运算符=
{
	bookno = lhs.bookno;
	units_sold = lhs.units_sold;
	price = lhs.price;
	return *this;
}
sales_data& sales_data ::operator += (const sales_data &rhs)//
{
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;
	return *this;//将this对象作为左值返回,*this相当于一个sales_item对象
}
double sales_data::avg_price()
{
	average = revenue / units_sold;
	return average;
}
string sales_data::isbn() const 
{
	return bookno;
}
//一个combine成员函数,用于将一个sales_data对象加到另一个对象上
sales_data& sales_data::combine(const sales_data &rhs)
{
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;
	return *this;
}
istream & read(istream &input, sales_data &rhs)//声明一个read函数,将数据从istream读入到sales_data对象中
{
	input >> rhs.bookno >> rhs.units_sold >> rhs.price;
	rhs.revenue = rhs.units_sold * rhs.price;
	return input;
}

sales_data add(const sales_data &lhs, const sales_data &rhs)//一个add的函数,执行两个sales_data对象的加法
{
	sales_data sum = lhs;
	sum.combine(rhs);
	sum.avg_price();
	return sum;
}
#endif





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值