sales.h
#ifndef STALES_h_
#define STALES_h_
#include
#include
using namespace std;
class Sales{
public:
enum{MONTHS=12};
private:
double gross[MONTHS];
int year;
public:
class bad_index:public logic_error
{
private:
int bi;
public:
explicit bad_index(int ix,const string &s=”Index error in Sales object\n”);
int bi_val()const {return bi;};
virtual ~bad_index()throw(){};//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);
};
class LabeledSales:public Sales
{
private:
string label;
public:
class nbad_index:public Sales::bad_index
{
private:
string lbl;
public:
nbad_index(const string &lb,int ix,const string &s=”Index error in LabeledSales object\n”);
const string &label_val()const{return lbl;};
virtual ~nbad_index()throw(){};
};
explicit LabeledSales(const string &lb=”none”,int yy=0);
LabeledSales(const string &lb,int yy,const double *gr,int n);
virtual ~LabeledSales(){};
const string &Label()const {return label;};
virtual double operator[](int i)const;
virtual double &operator[](int i);
};
#endif
sales.cpp
#include “sales.h”
#include
using namespace std;
Sales::bad_index::bad_index(int ix,const string &s):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++)//考虑n<months
gross[i]=0;
}
double Sales::operator[](int i)const
{
if(i<0i>=MONTHS)
throw (new bad_index(i));//这样子才是抛出指针
//throw *bad_index(i);//不能throw一个指针类型?
return gross[i];
}
double &Sales::operator[](int i)
{
if(i<0i>=MONTHS)
throw 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<0i>=MONTHS)
throw nbad_index(Label(),i);
return Sales::operator[](i);
}
double &LabeledSales::operator[](int i)
{
if(i<0i>=MONTHS)
//throw nbad_index(Label(),i);
throw (new nbad_index(Label(),i));
return Sales::operator[](i);
}
main154.cpp
#include
#include “sales.h”
void main154()
{
double vals1[12]={
1220,1100,1122,2212,1232,2334,
2884,2393,3302,2922,3002,3544
};
double vals2[12]={
12,11,22,21,32,34,
28,29,33,29,32,35
};
Sales sales1(2011,vals1,12);
LabeledSales sales2(“Blogstar”,2012,vals2,12);
cout<<”First try block:”<<endl;
try{
int i;
cout<<”Year=”<<sales1.Year()<<endl;
for(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;
if(p=dynamic_castLabeledSales::nbad\_index\*(bad))
{
cout<
cout<<”Company:”<
cout<<”bad index:”<
//p->label_val();
}
else
{
cout<
cout<<”bad index:”<
//cout<<”bad index:”<<bad.bi_val()<<endl;
}
}
try{
sales2[12]=37.5;
sales1[20]=23345;
cout<<”Enter of try block 2”<<endl;
}
catch(Sales::bad_index *bad)//用指针
{
LabeledSales::nbad_index *p;
if(p=dynamic_castLabeledSales::nbad\_index\*(bad))
{
cout<
cout<<”Company:”<
cout<<”bad index:”<
//p->label_val();
}
else
{
cout<
cout<<”bad index:”<
}
}
}
—————————————————————————————————————————————————— //写的错误或者不好的地方请多多指导,可以在下面留言或者给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。 转载请注明出处:https://www.royalchen.com/ author:royalchen Email:royalchen@royalchen.com ———————————————————————————————————————————————————
- 本文作者: royalchen
- 本文链接: http://www.royalchen.com/2016/02/24/cprimerplus第六版课后编程题答案154/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!