第二十四章 异常和错误处理 6异常类与模板的关系 简单

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

  

原文地址:https://www.cnblogs.com/xiangxiaodong/p/2719246.html