C++--异常处理遇上运算符重载

来源:互联网 发布:梦幻西游网络出错 编辑:程序博客网 时间:2024/03/28 23:36

今天我们来说下异常处理。

异常处理的基本语法:

try{

复合语句

}

catch(异常类型声明)

复合语句

catch(类型(形参))

复合语句


有这样一个案例:

设计一个数组类Myarray,重载[]操作

数据初始化时,对数据的个数进行有效的检查

1)index<0,抛出异常eNegative

2)index=0 抛出异常eZero

3)index>1000 抛出异常eTooBig

4)index<10 抛出异常 eTooSmall

5)eSize是以上类的父类,实现有参数构造,并定义virtual void printErr()输出错误。


根据以上条件我写了一个测试代码。

#include <iostream>using namespace std;class Myarray{public:Myarray(int len);~Myarray();int getlen();int& operator [](int index);class eSize{public:eSize(int size){m_size =size;}virtual  void pritErro(){cout << "Size" << m_size << endl;}protected:int m_size;};class eNagative :public eSize{public:eNagative(int size):eSize(size){}virtual  void pritErro(){cout << "eNagative_Size:" << m_size << endl;}};class eZero :public eSize{public:eZero(int size) :eSize(size){}virtual  void pritErro(){cout << "eZero_Size:" << m_size << endl;}};class eTooBig:public eSize{public:eTooBig(int size) :eSize(size){}virtual  void pritErro(){cout << "eTooBig_Size:" << m_size << endl;}};class eTooSmall :public eSize{public:eTooSmall(int size) :eSize(size){}virtual  void pritErro(){cout << "eTooSmall_Size:" << m_size << endl;}};private:int length;int *m_base;};Myarray::Myarray(int len){if (len < 0){throw eNagative(len);}else if (len==0){throw eZero(len);}else if (len < 10){throw eTooSmall(len);}else if (len >1000){throw eTooBig(len);}length = len;m_base = new int[length];}Myarray::~Myarray(){if (m_base != NULL){delete [] m_base;m_base = NULL;length = 0;}}int Myarray::getlen(){return length;}int &Myarray::operator[](int index){return m_base[index];}int main(){try{Myarray a(-5);for (int i = 0; i <a.getlen();i++){a[i] = i + 1;cout << a[i] << endl;}}catch (Myarray::eSize &e){e.pritErro();}return 0;}
如果写成Myarray a(-5); 会出现如下图所示结果

如果是Myarray a(20);会出现下面的结果。

其余就不一一测试了,这里要说的是
异常是超脱函数机制,是跨函数的。
异常严格的按照类型匹配原则。
基础知识就到这里。

1 0