//第二十四章 异常和错误处理 6异常类与模板的关系 #include <iostream> using namespace std; const int num=5; class wrong{}; template<class T> class people { public: people(int Size=num); ~people(){ delete []p; }; int&operator[](int off); const int&operator[](int off)const; int GetSize()const{ return size;} //class wrong{}; class offset{ public: offset(int Size):osize(Size){}; ~offset(){}; virtual int Get(){ return osize;} virtual void show(){ cout<<"丢出offset异常"<<endl; cout<<"下标值"<<osize<<"出错"<<endl; } protected: int osize; }; class Big:public offset{ public: Big(int Size):offset(Size){} virtual void show(){ cout<<"丢出Big异常"<<endl; cout<<"下标值为"<<offset::osize<<endl; } }; class Nav:public offset{ public: Nav(int Size):offset(Size){} virtual void show(){ cout<<"丢出Nav异常"<<endl; cout<<"下标值为"<<offset::osize<<endl; } }; class Small{ public: Small(int Size):_size(Size){} ~Small(){} virtual int Get(){ return _size;} virtual void show(){ cout<<"丢出Small异常"<<endl; cout<<"下标值为:"<<_size<<endl; } protected: int _size; }; class Zero: public Small{ public: Zero(int Size):Small(Size){} virtual void show() { cout<<"丢出Small异常"<<endl; cout<<"下标值为:"<<Small::_size<<endl; } }; private: int *p; int size; }; template <class T> people<T>::people(int Size):size(Size) { cout<<"调用构造函数"<<endl; if(Size == 0){ throw Zero(Size); } if(Size < 10){ throw Small(Size); } if(Size > 10000){ throw Big(Size); } if(Size < 1){ throw Nav(Size); } p = new int[Size]; for(int i=0; i<Size; i++) { p[i] = 0; } } template <class T> int&people<T>::operator[](int off) { if(off>=0 && off < GetSize()) { return p[off]; } throw wrong(); return p[0]; } //一样,只是该函数内的值是不可更改并且返回值也是不可更改的 template <class T> const int&people<T>::operator[](int off)const { int Size = GetSize(); if(off>=0 && off < GetSize()) { return p[off]; } throw wrong(); return p[0]; } int main() { try{ people<int> one(9); for(int i=0; i<100; i++){ one[i] = i; cout<<"one["<<i<<"]:"<<i<<endl; } } catch(wrong){ cout<<"超过数组长度,不能继续进行赋值操作"<<endl; } catch(people<int>::Big big){ //cout<<"数组值过大,值为:"<<big.Get()<<endl; big.show(); } catch(people<int>::Small small){ //cout<<"数组值过小,值为:"<<small.Get()<<endl; small.show(); } catch(people<int>::Zero zero){ //cout<<"下标值为0"<<endl; zero.show(); } catch(people<int>::Nav nav){ // cout<<"下标值为负数"<<endl; nav.show(); } catch(people<int>::offset offset){ //cout<<"下标值过大或者过小"<<endl; offset.show(); } return 0; }