//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 &
C.Primer.Plus(第六版)第15章 编程练习
最新推荐文章于 2023-03-26 20:14:17 发布
该博客主要展示了如何在C++中实现错误处理,通过自定义异常类`Sales::bad_index`和`LabeledSales::nbad_index`来处理数组越界问题。在`use_sales.cpp`中,用try-catch块捕获并处理这些异常。此外,还介绍了如何在`exc_mean.h`和`error4.cpp`中使用自定义异常类`bad_hmean`和`bad_gmean`处理数学计算中的错误。最后,展示了`tv.h`和相关源文件中电视类`Tv`和遥控器类`Remote`的实现,包括错误处理和交互模式的切换。
摘要由CSDN通过智能技术生成