模板和异常的问题

类别:编程语言 点击:0 评论:0 推荐:
 

模板和异常的问题

    在CSDN上看到这样的问题(文的网址为http://community.csdn.net/Expert/topic/3565/3565571.xml?temp=.4035608):

   有代码如下,帮忙填5个空格~~~~~~

01 #include <iostream.h> 
02 template <class T> class Array; 
03 
04 template <Class T> class ArrayBody { 
05  friend__(1)__; 
06  T* tpBody; 
07  int iRows,iColumns,iCurrentRow; 
08  ArrayBody(int iRsz,int iCsz){ 
09   tpBody = __(2)__; 
10   iRows = iRsz;iColumns = iCsz;iCurrentRow = -1: 
11 } 
12 
13 public: 
14  T& operator[](int j){ 
15   bool row_error,column_error; 
16   row_error = column_error =false; 
17   try { 
18    if(iCurrentRow < 0 || iCurrentRow >= iRows) 
19     row_error = true; 
20    if(j<0 ||j>= iColumns) 
21     column_error = true; 
22    if(row_error == true || column_ error == true) 
23     __(3)__; 
24   } 
25   catch(char){ 
26    if(row_error == true) 
27     cerr << "行下标越界[" << iCurrentRow << "]"; 
28    if(column_error = true) 
29     cerr << "列下标越界[" << j << "]"; 
30    cout << "\n"; 
31   } 
32   return tpBody[iCurrentRow * iColumns + j]; 
33  } 
34  ~Arraygody(){delete[]tpBody;} 
35 }; 
36 
37 template <class T> class Array { 
38  ArrayBody<T> tBody; 
39  public: 
40   ArrayBody<T> & operator[](int i) { 
41    __(4)__; 
42    return tBody; 
43   } 
44  Array(int iRsz,int iCsz):__(5)__ { } 
45  }; 
46 
47 void main() 
48 { 
49  Array<int> a1(10,20); 
50  Array<double> a2(3,5); 
51  int b1; 
52  double b2; 
53  b1 = a1[-5][10]; //有越界提示:行下标越界[-5] 
54  b1 = a1[10][15]; //有越界提示:行下标越界[10] 
55  b1 = a1[1][4];  //没有越界提示 
56  b2 = a2[2][6];  //有越界提示:列下标越界[6] 
57  b2 = a2[10][20]; //有越界提示;行下标越界[10]列下标越界[20] 
58  b2 = a2[1][4]; //没有越界提示 
59 }



    看完题目,这一个考模板的使用和异常捕获的题目。

    粗略一看,这里有2个类模板,一个是template <class T> class Array;另一个是template <Class T> class ArrayBody。通过这两个类模板实现一个二位数组的模拟。

    从上往下看,显然类模板 ArrayBody是Array的成员(第38行),Array可能要访问ArrayBody的成员(还不能肯定)。暂时可以猜测第一空第5行为的friend为Array<T>,这里用到的类模板或类不多,填这个的可能性比较大。

    第二空(第9行)tpBody为一个指针,给我的初步印象就是应该new一个什么,或者是指向什么。暂时还不肯定,先空下来。

    看第三空,第25行有个catch(char),显然23行应该是throw('e'),当然不一定是'e',只要是个char就行。

    第四空暂时还不知道,第五空肯定是ArrayBody(iRsz,iCsz)。为什么呢?因为这儿显然是要在构造Array之前先构造一个类(或模板),而Array的成员模板(或类)只有 ArrayBody了,应该是这样没错了。

    这里模拟的是一个二维数组,看一下49行 Array<int> a1(10,20);当执行这条语句的时候,应该先执行Array的构造函数,而在Array构造函数之前,应该先执行ArrayBody的构造函数,所以最先执行的是ArrayBody(int iRsz,int iCsz),tBody是一个指针,它应该指向什么呢,应该是分配一个空间吧,我首先想到的是 第二空填写 new T[iRsz][iCsz]。
    分配好空间后,给各个成员变量赋初值。好,OK,没问题。

    同样第50行的代码执行同49行。

    到了53行,b1 = a1[-5][10]; 首先执行ArrayBody<T> & operator[](int i),再执行T& operator[](int j),最后返回的是二位数组中指定变量的值。第23行 return tpBody[iCurrentRow * iColumns + j];这一点可以看出。奇怪,怎么iCurrentRow好像没有赋初值啊,对!第四空(第41行)应该填写tBody.iCurrentRow。

    好,慢着,return tpBody[iCurrentRow * iColumns + j]是个一维数组,那第二空的new T[iRsz][iCsz]是不是应该该成new T[iRsz * iCsz]。

    就这样,连猜带蒙填完了。但是还不能保证它的正确性。

    现在就需要验证才行。拿54行 b1 = a1[10][15];

    1.首先执行ArrayBody<T> & operator[](int i),此时a.tBody.iCurrentRow应该为10;

    2.接着执行T& operator[](int j),a.tBody.j应该为15。由于a.tBody.iCurrentRow的值(==10)等于允许的最大行数(iRows == 10,所以a.tBody.iCurrentRow最大只能为9),所以row_error == true , column_ error == false,捕获异常,因而行下标越界。正如程序注视中提示的。所以应该可以认为这个答案是正确的了。

   

    以上是个人观点,错误指出敬请指教!^_^

本文地址:http://com.8s8s.com/it/it25256.htm