分享
 
 
 

模板和异常的问题

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

模板和异常的问题

在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,捕获异常,因而行下标越界。正如程序注视中提示的。所以应该可以认为这个答案是正确的了。

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有