﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-The Coder-文章分类-C++语言特性和设计</title><link>http://www.cppblog.com/bch515/category/1875.html</link><description>I am a humble coder.</description><language>zh-cn</language><lastBuildDate>Fri, 30 May 2008 21:06:19 GMT</lastBuildDate><pubDate>Fri, 30 May 2008 21:06:19 GMT</pubDate><ttl>60</ttl><item><title>C++异常处理小例</title><link>http://www.cppblog.com/bch515/articles/7919.html</link><dc:creator>TH</dc:creator><author>TH</author><pubDate>Wed, 31 May 2006 02:29:00 GMT</pubDate><guid>http://www.cppblog.com/bch515/articles/7919.html</guid><wfw:comment>http://www.cppblog.com/bch515/comments/7919.html</wfw:comment><comments>http://www.cppblog.com/bch515/articles/7919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bch515/comments/commentRss/7919.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bch515/services/trackbacks/7919.html</trackback:ping><description><![CDATA[学习程序的好方法是阅读代码和改进代码。<br />下面的程例来自《An Overview of the C++ Programming Language》（5．1 异常和错误处理）<br />程序用途：使用C++的异常机制，报告stack的上溢或者下溢。（我适当的把代码补全。）<br /><br />version 1 演示了基本的异常用法。<br />从try里抛出一个异常（实例或对象），由catch里的类接受。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">version </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> From: An Overview of the C++ Programming Language</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdlib</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Stack{<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> v;<br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> max_size;<br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> top;<br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Underflow{ };   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 下溢</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Overflow{ };    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 上溢<br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #008000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> construct function. determine the size   </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> s): max_size(s), top(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">){ v </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> T[max_size];}      <br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack(){}<br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> push(T c){<br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(top </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> max_size) </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> Overflow();<br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">        v[top</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> c;<br /></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">    T pop(){<br /></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(top </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> Underflow();<br /></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> v[</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">top];<br /></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">}; <br /></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f()<br /></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">    Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> ss(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">32</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">33</span> <span style="COLOR: #000000">        ss.push(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Quiz</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">34</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ss.pop();<br /></span><span style="COLOR: #008080">35</span> <span style="COLOR: #000000">        ss.pop();<br /></span><span style="COLOR: #008080">36</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">37</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Overflow){<br /></span><span style="COLOR: #008080">38</span> <span style="COLOR: #000000">        cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error: stack overflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">39</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">40</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Underflow){<br /></span><span style="COLOR: #008080">41</span> <span style="COLOR: #000000">        cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error: stack underflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">42</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">43</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">44</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">45</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br /></span><span style="COLOR: #008080">46</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">47</span> <span style="COLOR: #000000">    f();<br /></span><span style="COLOR: #008080">48</span> <span style="COLOR: #000000">    system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">PAUSE</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">49</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> EXIT_SUCCESS;<br /></span><span style="COLOR: #008080">50</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">51</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">52</span> <span style="COLOR: #000000">输出结果：error: stack underflow<br /></span><span style="COLOR: #008080">53</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">54</span> <span style="COLOR: #000000"></span></div><p><br />改进，我们的第二个版本如下：<br />如果将</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Underflow{ };   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 下溢</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Overflow{ };    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 上溢</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">和<br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Overflow){<br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">        cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error: stack overflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Underflow){<br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">        cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error: stack underflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"></span></div><p><br />分别改成如下：</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Underflow{      </span><span style="COLOR: #008000">//<br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">){<br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">            cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stack Underflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">        }    <br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">    };   <br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Overflow{       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">){<br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">            cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stack Overflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">        } <br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">    };   <br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">和<br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Overflow</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> e){<br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">        e.error();<br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Underflow</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> e){<br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">        e.error();<br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000"></span></div><p>改后的程序和原先的区别在哪里，看出来了吗？ 呵呵呵。<br /><br />当然，我们还能将代码改进。这样产生了第三个版本。<br /><br />第三个版本：version3<br />在Stack里面添加一个类class Stack_error,让Underflow和Overflow都继承它：</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Stack{<br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <img src="http://www.cppblog.com/images/dot.gif" />    </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> stack_error{<br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">){　　</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">当然，可以把它做成纯虚的。抽象类。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">            cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stack_error</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    };<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Underflow: </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> stack_error{      </span><span style="COLOR: #008000">//<br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">){<br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">            cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stack Underflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">        }    <br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    };   <br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Overflow: </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> stack_error{       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">){<br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">            cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stack Overflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">        } <br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">    };   <br /></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">23</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000"></span></div>接着把两个catch合并成一个catch，如下。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br />     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> the same<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    }<br />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::stack_error</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> e){<br />        e.error();<br />    }<br /></span></div><br />这三个版本的功能是一样的，但版本越高，代码越清晰，代码也越容易维护。<br /><br />如果我们设计了一个库（比如上面的Stack），在开始的时候想到的就是两个异常，overflow和underflow。如果有version1和version3 这两种方法设计Stack，那么函数f()（用户的代码）也同样version1和version３。当一段日子过去了，我们准备再加入一个异常，比如midflow()（呵呵呵，我也想不出有什么类似的异常了）。这样的话，库设计者对用户说：“我们发现了midflow()异常，并加入库代码中，请您改写您的代码f()。”<br />这样我们的version1得修改成如下形式：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f()<br />{<br />    Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> ss(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br />　    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/dot.gif" />.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    }<br />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Overflow){<br />        cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error: stack overflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br />    }<br />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Underflow){<br />        cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error: stack underflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br />    }<br />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Midflow){    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">我们的找到所有扑捉stack异常的代码，并加入这两句。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">          cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error: stack midflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br />    }<br />}<br /></span></div><br />而version3由于midflow()继承了stack_error。而其接口还是一样，客户代码就无需更改了。<br /><br /> 完毕。鞠躬。 请多多交流！<br /><br />附：version3完整代码： <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">Version </span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdlib</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Stack{<br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">    T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> v;<br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> max_size;<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> top;<br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> stack_error{<br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    };<br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Underflow: </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> stack_error{      </span><span style="COLOR: #008000">//<br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">){<br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">            cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stack Underflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">        }    <br /></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">    };   <br /></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Overflow: </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> stack_error{       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">24</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> error(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">){<br /></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">            cerr </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stack Overflow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl;<br /></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">        } <br /></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000">    };   <br /></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000">    Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> s): max_size(s), top(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">){ v </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> T[max_size];}        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> construct function. determine the size   </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">30</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack(){}<br /></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> push(T c){<br /></span><span style="COLOR: #008080">32</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(top </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> max_size) </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> Overflow();<br /></span><span style="COLOR: #008080">33</span> <span style="COLOR: #000000">        v[top</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> c;<br /></span><span style="COLOR: #008080">34</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">35</span> <span style="COLOR: #000000">    T pop(){<br /></span><span style="COLOR: #008080">36</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(top </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> Underflow();<br /></span><span style="COLOR: #008080">37</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> v[</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">top];<br /></span><span style="COLOR: #008080">38</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">39</span> <span style="COLOR: #000000">}; <br /></span><span style="COLOR: #008080">40</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">41</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f()<br /></span><span style="COLOR: #008080">42</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">43</span> <span style="COLOR: #000000">    Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> ss(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">44</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">45</span> <span style="COLOR: #000000">        ss.push(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Quiz</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">46</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ss.pop();<br /></span><span style="COLOR: #008080">47</span> <span style="COLOR: #000000">        ss.pop();<br /></span><span style="COLOR: #008080">48</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">49</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::stack_error</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> e){<br /></span><span style="COLOR: #008080">50</span> <span style="COLOR: #000000">        e.error();<br /></span><span style="COLOR: #008080">51</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">52</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">53</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">54</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">55</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br /></span><span style="COLOR: #008080">56</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">57</span> <span style="COLOR: #000000">    f();<br /></span><span style="COLOR: #008080">58</span> <span style="COLOR: #000000">    system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">PAUSE</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">59</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> EXIT_SUCCESS;<br /></span><span style="COLOR: #008080">60</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">61</span> <span style="COLOR: #000000"></span></div><br /><img src ="http://www.cppblog.com/bch515/aggbug/7919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bch515/" target="_blank">TH</a> 2006-05-31 10:29 <a href="http://www.cppblog.com/bch515/articles/7919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>