//sale.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");
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;
};
//sale.cpp
#include"sale.h"
using std::string;
Sales::bad_index::bad_index(int ix,const 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 (new bad_index(i));
return gross[i];
}
LabeledSales::nbad_index::nbad_index(const string &lb,int ix,const string& s):Sales::bad_index(ix,s)
{
lbl=lb;
}
LabeledSales::LabeledSales(const string &lb,int yy):Sales(yy)
{
label=lb;
}
LabeledSales::LabeledSales(const string &lb,int yy,const double *gr,int n):Sales(yy,gr,n){
label=lb;
}
double LabeledSales::operator[](int i)const
{
if(i<0||i>MONTHS)
throw nbad_index(Label(),i);
return Sales::operator[](i);
}
double & LabeledSales::operator[](int i)
{
if(i<0||i>=MONTHS)
throw (new nbad_index(Label(),i));//加new 抛出指针
return Sales::operator[](i);
}
//main.cpp
#include<iostream>
#include"sale.h"
int main()
{
using std::cout;
using std::cin;
using std::endl;
double vals1[12]={
1120,1100,1122,2223,2123,3344,
1212,1232,1232,1232,2313,1232
};
double vals2[12]={
12,11,23,22,23,23,
34,23,23,43,34,34
};
Sales sales1(2011,vals1,12);
LabeledSales sales2("Blogstar",2021,vals2,12);
cout <<"first try block:"<<endl;
try{
int i;
cout <<"year= "<<sales1.Year()<<endl;
for(int i= 0;i<12;++i)
{
cout<<sales1[i]<<' ';
if (i%6==5)
cout<<endl;
}
cout<<" year="<<sales2.Year()<<endl;
cout<<" label= "<<sales2.Label()<<endl;
for(i=0;i<=12;++i)
{
cout<<sales2[i]<<' ';
if(i%6==5)
cout<<endl;
}
cout<<"end of try block 1."<<endl;
}
catch(Sales::bad_index *bad)
{
LabeledSales::nbad_index *p;
cout<<bad->what()<<endl;
cout<<"bad index: "<<bad->bi_val()<<endl;
if(p=dynamic_cast<LabeledSales::nbad_index *>(bad))
cout<<"company :"<<p->label_val()<<endl;
}
cout<<"try block: "<<endl;
try {
sales2[2]=36;
sales1[21]=33443;
cout<<"end of try block 2"<<endl;
}
catch(Sales ::bad_index *bad)
{
LabeledSales::nbad_index *p;
cout<<bad->what()<<endl;
cout<<"bad index: "<<bad->bi_val()<<endl;
if(p=dynamic_cast<LabeledSales::nbad_index*>(bad))
cout<<" company:"<<p->label_val()<<endl;
}
cout<<"done"<<endl;
system("pause");
return 0;
}
15.4
最新推荐文章于 2021-07-23 22:18:16 发布