align=center></P>
><B>5 </B><B>大规模程序设计</B>(Large-scale Programming)<B></B></P>
><B> </B></P>" `6 |6 Q; o. ^# s0 B" `% P
>本文的主要内容涵盖的是C++所支持的主要程序设计风格。然而namespace和异常处理机制虽然是重要的语言特性,但却并不属于这种讨论范畴,因为它们在所有的程序设计风格中都能支持大规模程序设计。在将分散的部件组合成完整程序的过程中,namespace和异常处理机制被用来缓减整个过程的难度和复杂度;随着程序规模的增大,它们也随之起到越来越重要的作用。</P>
> </P>
><B>5</B><B>.</B><B>1 </B><B>异常和错误处理</B>(Exceptions and Error Handling)</P>. b4 u' _8 N0 @& b' K/ z
>当在某个位置检测到一个错误的时候,我们使用<I>异常</I>来把程序的控制权转交到能够处理这种错误的调用者(caller)那里。显然,这种机制只用来处理那些在当前区域内无法处理的错误。</P>/ g4 e% d H0 ?0 O$ ]9 \
>有人可能会问:“如果一个位置所发生的事情最终能够被正确的处理并使得程序如期正常运行,那么这件事情又怎么能被认为是一个错误呢?”事实上,我们把这类异常事件(或简称异常)以及用来处理这类事件的语言机制一起成为异常处理(exception handling)。</P>
>我们可以像这样报告Stack中发生的上溢(overflow)和下溢(underflow)错误:</P>
>template<class T> class Stack {</P>; K" w7 Z, P z
>T* v;</P>% l- I: _, ?+ e0 r. T) R; `& g
>Int max_size;</P>' X6 F5 c) F. ?1 B k
>Int top;</P>; X5 y" X. J1 t8 e( X8 G9 s
>
ublic:</P>
>class Underflow { }; // 用来报告下溢情况的型别</P>
>class Overflow { }; // 用来报告上溢情况的型别</P>
>Stack(int s); // 构造函数</P>' G1 c* [# r( x1 F, h0 M2 C3 h
>~Stack(); // 析构函数</P>- A/ x7 L; k# K- r$ P
>void push(T c)</P>& w; n# E: u# X3 B }6 W
>{</P>3 c) M# j2 w% w" ~
> if (top == max_size) throw Overflow(); // 检查是否发生错误</P>7 F$ E+ U; C8 |1 Q2 S8 v
> v[top++] = c; // 增加top并将c存放在top位置</P>
>}</P># d- x$ i! H% Z+ }% M1 E
>T pop()</P>6 O" y! V3 g' x1 B" H# e, k
>{</P>
> if (top == 0) throw Underflow(); // 检查是否发生错误</P>
> return v[--top]; //减少top</P>
>}</P>
>};</P>5 U& c4 D Y' }# W, ?| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |