模板和异常的问题
在优快云上看到这样的问题(文的网址为http://community.youkuaiyun.com/Expert/topic/3565/3565571.xml?temp=.4035608):
| 有代码如下,帮忙填5个空格~~~~~~ 01 #include <iostream.h> |
看完题目,这一个考模板的使用和异常捕获的题目。
粗略一看,这里有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,捕获异常,因而行下标越界。正如程序注视中提示的。所以应该可以认为这个答案是正确的了。
以上是个人观点,错误之处敬请指教!^_^
354

被折叠的 条评论
为什么被折叠?



