sales.h
#ifndef STALES_h_ #define STALES_h_ #include <stdexcept> #include <string> 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 <iostream> 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<0||i>=MONTHS) throw (new bad_index(i));//这样子才是抛出指针 //throw *bad_index(i);//不能throw一个指针类型? 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 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 nbad_index(Label(),i); throw (new nbad_index(Label(),i)); return Sales::operator[](i); }
main154.cpp
#include <iostream> #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_cast<LabeledSales::nbad_index*>(bad)) { cout<<p->what(); cout<<"Company:"<<p->label_val()<<endl; cout<<"bad index:"<<p->bi_val()<<endl; //p->label_val(); } else { cout<<bad->what(); cout<<"bad index:"<<bad->bi_val()<<endl; // 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_cast<LabeledSales::nbad_index*>(bad)) { cout<<p->what(); cout<<"Company:"<<p->label_val()<<endl; cout<<"bad index:"<<p->bi_val()<<endl; //p->label_val(); } else { cout<<bad->what(); cout<<"bad index:"<<bad->bi_val()<<endl; } } }
——————————————————————————————————————————————————
//写的错误或者不好的地方请多多指导,可以在下面留言或者给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。
转载请注明出处:https://www.royalchen.com/
author:royalchen
Email:royalchen@royalchen.com
———————————————————————————————————————————————————