C.Primer.Plus(第六版)第15章 编程练习

//sales.h     //15.4
#ifndef SALES__H__
#define SALES__H__
#include <stdexcept>
#include <string>
class Sales
{
public:
	enum{MONTHS = 12};
	class bad_index : public std::logic_error
	{
	private:
		int bi;
	public:
		explicit bad_index(int ix,const std::string & s = "Index error in Sales object\n");
		int bi_val() const {return bi;}
		virtual ~bad_index() throw() {}
	};
	explicit Sales(int yy = 0);
	Sales(int yy ,const double* gr,int n);
	virtual ~Sales() {}
	int Year() const {return year;}
	virtual double operator[] (int i) const;
	virtual double & operator[] (int i);
private:
	double gross[MONTHS];
	int year;
};
class LabeledSales : public Sales
{
public:
	class nbad_index : public Sales::bad_index
	{
	private:
		std::string lbl;
	public:
		nbad_index(const std::string & lb,int ix,
			const std::string & s = "Index error in LabeledSales object\n");
		const std::string & label_val() const {return lbl;}
		virtual ~nbad_index() throw() {}
	};
	explicit LabeledSales(const std::string & lb = "none",int yy = 0);
	LabeledSales(const std::string & lb, int yy ,const double* gr,int n);
	virtual ~LabeledSales() {}
	const std::string & Label() const {return label;}
	virtual double operator[] (int i) const;
	virtual double & operator[] (int i);
private:
	std::string label;
};
#endif
//sales.cpp
#include "sales.h"
using std::string;
Sales::bad_index::bad_index(int ix, const std::string &s) : std::logic_error(s), bi(ix)  
{  
}  
  
Sales::Sales(int yy)  
{  
    year = yy;  
    for (int i = 0; i < MONTHS; ++i)  
        gross[i] = 0;  
}  
  
Sales::Sales(int yy, const double *gr, int n)  
{  
    year = yy;  
    int lim = (n < MONTHS) ? n : MONTHS;  
    int i;  
    for (i = 0; i < lim; ++i)  
        gross[i] = gr[i];  
    for (; i < MONTHS; ++i)  
        gross[i] = 0;  
}  
  
double Sales::operator[](int i) const  
{  
    if (i < 0 || i >= MONTHS)  
        throw bad_index(i);  
    return gross[i];  
}  
  
double &Sales::operator[](int i)  
{  
    if (i < 0 || i >= MONTHS)  
        throw bad_index(i);  
    return gross[i];  
}  
  
LabeledSales::nbad_index::nbad_index(const std::string &lb, int ix, const std::string &s) : Sales::bad_index(ix, s)  
{  
    lbl = lb;  
}  
  
LabeledSales::LabeledSales(const std::string &lb, int yy) : Sales(yy)  
{  
    label = lb;  
}  
  
LabeledSales::LabeledSales(const std::string &lb, int yy, const double *gr, int n) : Sales(yy, gr, n)  
{  
    label = lb;  
}  
  
double LabeledSales::operator[](int i) const  
{  
    if (i &
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值