模板和异常的问题

模板和异常的问题

在优快云上看到这样的问题(文的网址为http://community.youkuaiyun.com/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,捕获异常,因而行下标越界。正如程序注视中提示的。所以应该可以认为这个答案是正确的了。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值