//第二十四章 异常和错误处理 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;
}