﻿<?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++博客-c++探索</title><link>http://www.cppblog.com/bloodsuck/</link><description>玩玩</description><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 17:18:25 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 17:18:25 GMT</pubDate><ttl>60</ttl><item><title>1个短小的实例，显示构建和中序遍历2叉查找树</title><link>http://www.cppblog.com/bloodsuck/archive/2009/05/13/82842.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 13 May 2009 09:21:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2009/05/13/82842.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/82842.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2009/05/13/82842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/82842.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/82842.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;</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">&nbsp;&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</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">&nbsp;&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BinarySearchTree<br></span><span style="COLOR: #008080">&nbsp;&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_107_656_Open_Image onclick="this.style.display='none'; Codehighlighter1_107_656_Open_Text.style.display='none'; Codehighlighter1_107_656_Closed_Image.style.display='inline'; Codehighlighter1_107_656_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_107_656_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_107_656_Closed_Text.style.display='none'; Codehighlighter1_107_656_Open_Image.style.display='inline'; Codehighlighter1_107_656_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_107_656_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_107_656_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;friend&nbsp;&nbsp;ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;,&nbsp;BinarySearchTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;BinarySearchTree();<br></span><span style="COLOR: #008080">&nbsp;11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;insert(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;midvisit()<br></span><span style="COLOR: #008080">&nbsp;13</span><span style="COLOR: #000000"><img id=Codehighlighter1_244_266_Open_Image onclick="this.style.display='none'; Codehighlighter1_244_266_Open_Text.style.display='none'; Codehighlighter1_244_266_Closed_Image.style.display='inline'; Codehighlighter1_244_266_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_244_266_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_244_266_Closed_Text.style.display='none'; Codehighlighter1_244_266_Open_Image.style.display='inline'; Codehighlighter1_244_266_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_244_266_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_244_266_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;midvisit(root);<br></span><span style="COLOR: #008080">&nbsp;16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;TNode<br></span><span style="COLOR: #008080">&nbsp;22</span><span style="COLOR: #000000"><img id=Codehighlighter1_307_480_Open_Image onclick="this.style.display='none'; Codehighlighter1_307_480_Open_Text.style.display='none'; Codehighlighter1_307_480_Closed_Image.style.display='inline'; Codehighlighter1_307_480_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_307_480_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_307_480_Closed_Text.style.display='none'; Codehighlighter1_307_480_Open_Image.style.display='inline'; Codehighlighter1_307_480_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_307_480_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_307_480_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;friend&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BinarySearchTree;<br></span><span style="COLOR: #008080">&nbsp;24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;TNode(T&nbsp;a)<br></span><span style="COLOR: #008080">&nbsp;26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;:data(a),<br></span><span style="COLOR: #008080">&nbsp;27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;left(NULL),<br></span><span style="COLOR: #008080">&nbsp;28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;right(NULL)<br></span><span style="COLOR: #008080">&nbsp;29</span><span style="COLOR: #000000"><img id=Codehighlighter1_409_414_Open_Image onclick="this.style.display='none'; Codehighlighter1_409_414_Open_Text.style.display='none'; Codehighlighter1_409_414_Closed_Image.style.display='inline'; Codehighlighter1_409_414_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_409_414_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_409_414_Closed_Text.style.display='none'; Codehighlighter1_409_414_Open_Image.style.display='inline'; Codehighlighter1_409_414_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_409_414_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_409_414_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;T&nbsp;data;<br></span><span style="COLOR: #008080">&nbsp;35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;TNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;left;<br></span><span style="COLOR: #008080">&nbsp;36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;TNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;right;<br></span><span style="COLOR: #008080">&nbsp;37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;insert(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T&nbsp;,TNode</span><span style="COLOR: #000000">*&amp;</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;midvisit(TNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;x)<br></span><span style="COLOR: #008080">&nbsp;40</span><span style="COLOR: #000000"><img id=Codehighlighter1_541_639_Open_Image onclick="this.style.display='none'; Codehighlighter1_541_639_Open_Text.style.display='none'; Codehighlighter1_541_639_Closed_Image.style.display='inline'; Codehighlighter1_541_639_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_541_639_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_541_639_Closed_Text.style.display='none'; Codehighlighter1_541_639_Open_Image.style.display='inline'; Codehighlighter1_541_639_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_541_639_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_541_639_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(x</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br></span><span style="COLOR: #008080">&nbsp;42</span><span style="COLOR: #000000"><img id=Codehighlighter1_560_575_Open_Image onclick="this.style.display='none'; Codehighlighter1_560_575_Open_Text.style.display='none'; Codehighlighter1_560_575_Closed_Image.style.display='inline'; Codehighlighter1_560_575_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_560_575_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_560_575_Closed_Text.style.display='none'; Codehighlighter1_560_575_Open_Image.style.display='inline'; Codehighlighter1_560_575_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_560_575_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_560_575_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;midvisit(x</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">left);<br></span><span style="COLOR: #008080">&nbsp;46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data;<br></span><span style="COLOR: #008080">&nbsp;47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;midvisit(x</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">right);<br></span><span style="COLOR: #008080">&nbsp;48</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>TNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;root;<br></span><span style="COLOR: #008080">&nbsp;51</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;52</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;53</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;54</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;T2</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;55</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;os,&nbsp;BinarySearchTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T2</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;a)<br></span><span style="COLOR: #008080">&nbsp;56</span><span style="COLOR: #000000"><img id=Codehighlighter1_739_747_Open_Image onclick="this.style.display='none'; Codehighlighter1_739_747_Open_Text.style.display='none'; Codehighlighter1_739_747_Closed_Image.style.display='inline'; Codehighlighter1_739_747_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_739_747_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_739_747_Closed_Text.style.display='none'; Codehighlighter1_739_747_Open_Image.style.display='inline'; Codehighlighter1_739_747_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_739_747_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_739_747_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;57</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;58</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;59</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;60</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;61</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>BinarySearchTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::BinarySearchTree()<br></span><span style="COLOR: #008080">&nbsp;62</span><span style="COLOR: #000000"><img id=Codehighlighter1_810_824_Open_Image onclick="this.style.display='none'; Codehighlighter1_810_824_Open_Text.style.display='none'; Codehighlighter1_810_824_Closed_Image.style.display='inline'; Codehighlighter1_810_824_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_810_824_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_810_824_Closed_Text.style.display='none'; Codehighlighter1_810_824_Open_Image.style.display='inline'; Codehighlighter1_810_824_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_810_824_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_810_824_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;63</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;64</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>root</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br></span><span style="COLOR: #008080">&nbsp;65</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;66</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;67</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BinarySearchTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::insert(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T&nbsp;a,TNode</span><span style="COLOR: #000000">*&amp;</span><span style="COLOR: #000000">&nbsp;t)<br></span><span style="COLOR: #008080">&nbsp;68</span><span style="COLOR: #000000"><img id=Codehighlighter1_901_1033_Open_Image onclick="this.style.display='none'; Codehighlighter1_901_1033_Open_Text.style.display='none'; Codehighlighter1_901_1033_Closed_Image.style.display='inline'; Codehighlighter1_901_1033_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_901_1033_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_901_1033_Closed_Text.style.display='none'; Codehighlighter1_901_1033_Open_Image.style.display='inline'; Codehighlighter1_901_1033_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_901_1033_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_901_1033_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;69</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(t</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br></span><span style="COLOR: #008080">&nbsp;70</span><span style="COLOR: #000000"><img id=Codehighlighter1_924_958_Open_Image onclick="this.style.display='none'; Codehighlighter1_924_958_Open_Text.style.display='none'; Codehighlighter1_924_958_Closed_Image.style.display='inline'; Codehighlighter1_924_958_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_924_958_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_924_958_Closed_Text.style.display='none'; Codehighlighter1_924_958_Open_Image.style.display='inline'; Codehighlighter1_924_958_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_924_958_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_924_958_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;71</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;t</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TNode(a);<br></span><span style="COLOR: #008080">&nbsp;72</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;73</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;74</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">t</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data)<br></span><span style="COLOR: #008080">&nbsp;75</span><span style="COLOR: #000000"><img id=Codehighlighter1_977_1002_Open_Image onclick="this.style.display='none'; Codehighlighter1_977_1002_Open_Text.style.display='none'; Codehighlighter1_977_1002_Closed_Image.style.display='inline'; Codehighlighter1_977_1002_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_977_1002_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_977_1002_Closed_Text.style.display='none'; Codehighlighter1_977_1002_Open_Image.style.display='inline'; Codehighlighter1_977_1002_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_977_1002_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_977_1002_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;76</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;insert(a,t</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">right);<br></span><span style="COLOR: #008080">&nbsp;77</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;78</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;79</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;insert(a,t</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">left);<br></span><span style="COLOR: #008080">&nbsp;80</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;81</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;82</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;83</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;84</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BinarySearchTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::insert(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T&nbsp;a)<br></span><span style="COLOR: #008080">&nbsp;85</span><span style="COLOR: #000000"><img id=Codehighlighter1_1100_1124_Open_Image onclick="this.style.display='none'; Codehighlighter1_1100_1124_Open_Text.style.display='none'; Codehighlighter1_1100_1124_Closed_Image.style.display='inline'; Codehighlighter1_1100_1124_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1100_1124_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1100_1124_Closed_Text.style.display='none'; Codehighlighter1_1100_1124_Open_Image.style.display='inline'; Codehighlighter1_1100_1124_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1100_1124_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1100_1124_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;86</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;insert(a,root);<br></span><span style="COLOR: #008080">&nbsp;87</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;88</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br></span><span style="COLOR: #008080">&nbsp;89</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;90</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;91</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;92</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br></span><span style="COLOR: #008080">&nbsp;93</span><span style="COLOR: #000000"><img id=Codehighlighter1_1163_1294_Open_Image onclick="this.style.display='none'; Codehighlighter1_1163_1294_Open_Text.style.display='none'; Codehighlighter1_1163_1294_Closed_Image.style.display='inline'; Codehighlighter1_1163_1294_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1163_1294_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1163_1294_Closed_Text.style.display='none'; Codehighlighter1_1163_1294_Open_Image.style.display='inline'; Codehighlighter1_1163_1294_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1163_1294_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1163_1294_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;94</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;BinarySearchTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;a;<br></span><span style="COLOR: #008080">&nbsp;95</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br></span><span style="COLOR: #008080">&nbsp;96</span><span style="COLOR: #000000"><img id=Codehighlighter1_1217_1235_Open_Image onclick="this.style.display='none'; Codehighlighter1_1217_1235_Open_Text.style.display='none'; Codehighlighter1_1217_1235_Closed_Image.style.display='inline'; Codehighlighter1_1217_1235_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1217_1235_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1217_1235_Closed_Text.style.display='none'; Codehighlighter1_1217_1235_Open_Image.style.display='inline'; Codehighlighter1_1217_1235_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_1217_1235_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1217_1235_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;97</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;a.insert(i);<br></span><span style="COLOR: #008080">&nbsp;98</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;99</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">insert&nbsp;data</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">100</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a.midvisit();<br></span><span style="COLOR: #008080">101</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">102</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">103</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/82842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2009-05-13 17:21 <a href="http://www.cppblog.com/bloodsuck/archive/2009/05/13/82842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组浅析</title><link>http://www.cppblog.com/bloodsuck/archive/2008/06/06/52331.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Fri, 06 Jun 2008 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2008/06/06/52331.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/52331.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2008/06/06/52331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/52331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/52331.html</trackback:ping><description><![CDATA[int a[10]<br>int b[20][10]<br><br>&nbsp;类型：<br>a:&nbsp;&nbsp; int [10]<br>b:&nbsp;&nbsp;&nbsp;int [20][10]<br>a, b 都是右值<br>&nbsp;精确装换级别类型：<br>&nbsp;a---&gt;int *<br>b ----&gt;int (*)[10]<br>&nbsp; 地址类型<br>&amp;a : int (*)[10]<br>&amp;b:int (*)[20][10]&nbsp;<br>&nbsp;&nbsp; <br><br>问题：如何在堆中动态分配多维数组<br>思路：降维分配<br>int ** p;<br>int a=30;<br>int b=50;<br>p=new int * [30];//2维分配<br>*(p+1)=new int [50];<br>*(p+2)=new int [50];<br>一维是连续地址<br>2维是非连续的<br><br>另种思路：结构指针<br>struct color<br>{<br>&nbsp; int * a;<br>}<br>color * b;<br>b=new color[50];<br>b[1].a=new int [60];
<img src ="http://www.cppblog.com/bloodsuck/aggbug/52331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2008-06-06 10:37 <a href="http://www.cppblog.com/bloodsuck/archive/2008/06/06/52331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1秒钟的命运</title><link>http://www.cppblog.com/bloodsuck/archive/2007/07/18/28261.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 18 Jul 2007 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2007/07/18/28261.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/28261.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2007/07/18/28261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/28261.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/28261.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这种关键的时刻，那些平时慢慢悠悠顺序发生和并列发生的事，都压缩在这样一个决定一切的短暂时刻表现出来。这一时刻对世世代代作出不可改变的决定，它决定着一个人的生死、一个民族的存亡甚至整个人类的命运。 <br>命运总是迎着强有力的人物和不可一世者走去。多少年来，命运总是使自己屈从于这样的个人：凯撒、亚历山大、拿破仑，因为命运喜欢这些像自己那样不可捉摸的强权人物。</p>
<p>但是有时候，当然，这在任何时代都是极为罕见的，命运也会出于一种奇怪的心情，把自己抛到一个平庸之辈的手中。有时候——这是世界历史上最令人惊奇的时刻——命运之线在瞬息时间内是掌握在一个窝囊废手中。英雄们的世界游戏像一阵风暴似的也把那些平庸之辈卷了进来。但是当重任突然降临到他们身上时，与其说他们感到庆幸，毋宁说他们更感到骇怕。他们几乎都是把抛过来的命运又哆哆嗦嗦地从自己手里失落。一个平庸之辈能抓住机缘使自己平步青云，这是很难得的。因为伟大的事业降临到渺小人物的身上，仅仅是短暂的瞬间。谁错过了这一瞬间，它绝不会再恩赐第二遍。</p>
<p>格鲁希</p>
<p>维也纳会议正在举行。在玩弄权术和互相争吵之中，像一枚嗖嗖的炮弹飞来这样的消息：拿破仑这头被困的雄狮自己从厄尔巴岛的牢笼中闯出来了；拿破仑赶走了国王；军队又都狂热地举着旗帜投奔到他那一边&#8230;&#8230;好像被一只利爪攫住，那些刚刚还在互相抱怨的大臣们又都聚集在一起，他们再次联合起来，彻底击败这个篡权者。威灵顿开始从北边向法国进军，一支由布吕歇尔布统率的普鲁士军，作为他的增援部队从另一方向前进。施瓦尔岑贝格在莱茵河畔整装待发；而作为后备军的俄国军团，正带着全部辎重，缓慢地穿过德国。</p>
<p>拿破仑看清了这种致命的危险。他必须在普鲁士人、英国人、奥地利人联合成为一支欧洲盟军前就将他们分而攻之，各个击破。于是他匆忙把赌注押在欧洲流血最多的战场——比利时。（1815年）6月16日拿破仑大军的先头部队在林尼与普鲁士军遭遇，并将普军击败。这是这头雄狮的第一次猛击，这一击非常厉害，然而却不致命。被击败而并未被消灭的普军向布鲁塞尔撤退。</p>
<p>拿破仑准备向威灵顿的部队进攻。他不允许自己喘息，也不允许对方喘息，因为每拖延一天，就意味着给对方增添力量。17日，拿破仑率领全军到达四臂村高地前，威灵顿这个对手已在高地上筑好工事，严阵以待。拿破仑充分估计到自己面临的各种危险，即布吕歇尔的军队仅仅是被击败，而并未被消灭。这支军队随时可能与威灵顿的军队会合。为了防止这种可能性，他抽调出一部分部队去跟踪追击普鲁士军，以阻止他们与英军会合。</p>
<p>他把这支追击部队交给了格鲁希元帅指挥。格鲁希，一个气度中庸的男子，老实可靠，兢兢业业。他既没有缪拉那样的胆识魄力，也没有圣西尔那样的足智多谋，更缺乏内伊那样的英雄气概。关于他，没有神话般的传说，也没有谁把他描绘成威风凛凛的勇士。他从戎20年，他是缓慢地、一级一级地升到元帅的军衔。拿破仑大概也知道，格鲁希既不是气吞山河的英雄，也不是运筹帷幄的谋士。但是他自己的元帅，一半已在黄泉之下，而其余几位已对这种没完没了的风餐露宿的戎马生活十分厌倦，正怏怏不乐地呆在自己的庄园里呢。所以，拿破仑是出于无奈才对这个中庸的男子委以重任的。</p>
<p>17日上午11时，拿破仑第一次把独立指挥权交给格鲁希元帅。就在这一天，在这短暂的瞬间，唯唯诺诺的格鲁希跳出一味服从的军人习气，自己走进世界历史的行列。拿破仑的命令是清楚的：当他自己向英军进攻时，格鲁希务必率领交给他的三分之一兵力去追击普鲁士军，而且他必须始终和主力部队保持联系。</p>
<p>格鲁希元帅踌躇地接受了这项命令。他不习惯独立行事。只是当他看到皇帝的天才目光，才感到心里踏实，应承下来。格鲁希的部队在瓢泼大雨中出发。</p>
<p>决定世界历史的一瞬间</p>
<p>18日上午11点，炮手们接到命令：用榴弹炮轰击山头上的身穿红衣的英国士兵。接着，内伊——这位&#8220;雄中之杰&#8221;，率领步兵发起冲锋。从上午11点至下午1点，法军师团向高地进攻，一度占领了村庄和阵地，但又被击退下来，继而又发起进攻。在空旷、泥泞的山坡上已覆盖着1万具尸体。可是除了大量消耗以外，什么也没有达到。双方的军队都已疲惫不堪，双方的统帅都焦虑不安。双方都知道，谁先得到增援，谁就是胜利者。威灵顿等待着布吕歇尔；拿破仑盼望着格鲁希。</p>
<p>但是，格鲁希并未意识到拿破仑的命运掌握在他自己手中，他只是遵照命令于17日晚间出发，按预计方向去追击普鲁士军。因为敌人始终没有出现，被击溃的普军撤退的踪迹也始终没有找到。</p>
<p>正当格鲁希元帅在一户农民家里急急忙忙进早餐时，他脚底下的地面突然微微震动起来。所有的人都悉心细听。从远处一再传来沉闷的、渐渐消失的声音：这是大炮的声音，是远处炮兵正在开炮的声音，不过并不太远，至多只有三小时的路程。这是圣让山上的炮火声，是滑铁卢战役开始的声音。副司令热拉尔急切地要求：&#8220;立即向开炮的方向前进！&#8221;所有的人都毫不怀疑：皇帝已经向英军发起攻击了，一次重大的战役已经开始。可是格鲁希却拿不定主意。他习惯于唯命是从，他胆小怕事地死抱着写在纸上的条文——皇帝的命令：追击撤退的普军。热拉尔看到他如此犹豫不决，便恳切地请求：至少能让他率领自己的一师部队和若干骑兵到那战场上去。格鲁希考虑了一下。他只考虑了一秒钟。</p>
<p>然而格鲁希考虑的这一秒钟却决定了他自己的命运、拿破仑的命运和世界的命运。格鲁希使劲地摇了摇手说，把这样一支小部队再分散兵力是不负责任的，他的任务是追击普军，而不是其他。就这样，他拒绝了这一违背皇帝命令的行动。而决定性的一秒钟就在这一片静默之中消逝了，它一去不复返，以后，无论用怎样的言词和行动都无法弥补这一秒钟——威灵顿胜利了。</p>
<p>格鲁希的部队继续往前走。随着一小时一小时的过去，格鲁希越来越没有把握，因为令人奇怪的是，普军始终没有出现。显然，他们离开了退往布鲁塞尔去的方向。接着，情报人员报告了种种可疑的迹象，说明普军在撤退过程中已分几路转移到了正在激战的战场。如果这时候格鲁希赶紧率领队伍去增援皇帝，还是来得及的。但他只是怀着愈来愈不安的心情，继续等待着消息，等待着皇帝要他返回的命令。可是没有消息来。只有低沉的隆隆炮声震颤着大地，炮声却愈来愈远。孤注一掷的滑铁卢搏斗正在进行，炮弹便是投下来的铁骰子。</p>
<p>滑铁卢的下午</p>
<p>时间已经到了下午一点钟。拿破仑的四次进攻虽然被击退下来，但威灵顿主阵地的防线显然也出现了空隙。拿破仑正准备发起一次决定性的攻击。这时，他发现东北方向有一股黑的人群迎面奔来。一支新的部队！</p>
<p>所有的望远镜都立刻对准着这个方向。难道是格鲁希大胆地违背命令，奇迹般地及时赶到了？可是不！一个带上来的俘虏报告说，这是布吕歇尔将军的前卫部队，是普鲁士军队。此刻，皇帝第一次预感到，那支被击溃的普军为了抢先与英军会合，已摆脱了追击；而他——拿破仑自己却用了三分之一的兵力在空地上作毫无用处、失去目标的运动。他立即给格鲁希写了一封信，命令他不惜一切代价赶紧与自己靠拢，并阻止普军向威灵顿的战场集结。</p>
<p>与此同时，内伊元帅又接到了进攻的命令。必须在普军到达以前歼灭威灵顿部队。整个下午，向威灵顿的高地发起了一次又一次的冲锋。战斗一次比一次残酷，投入的步兵一次比一次多。但是威灵顿依旧岿然不动。而格鲁希那边却始终没有消息来。内伊元帅已决定把全部队伍都拉上去，决一死战。于是，1万名殊死一战的盔甲骑兵和步骑兵踩烂了英军的方阵，砍死了英军的炮手，冲破了英军的最初几道防线。虽然他们自己再次被迫撤退，但英军的战斗力已濒于殆尽。山头上像箍桶似的严密防线开始松散了。当受到重大伤亡的法军骑兵被炮火击退下来时，拿破仑的最后预备队——老近卫军正步履艰难地向山头进攻。欧洲的命运全系在能否攻占这一山头上。</p>
<p>决战</p>
<p>自上午以来，双方的400门大炮不停地轰击着。前线响彻骑兵队向开火的方阵冲杀的铁蹄声。从四面八方传来的冬冬战鼓声，震耳欲聋，整个平原都在颤动！但是在双方的山头上，双方的统帅似乎都听不见这嘈杂的人声。他们只是倾听着更为微弱的声音。</p>
<p>两只表在双方的统帅手中，像小鸟的心脏似的在嘀嗒嘀嗒地响。这轻轻的钟表声超过所有震天的吼叫声。拿破仑和威灵顿各自拿着自己的计时器，数着每一小时，每一分钟，计算着还有多少时间，最后的决定性的增援部队就该到达了。威灵顿知道布吕歇尔就在附近。而拿破仑则希望格鲁希也在附近。现在双方都已没有后备部队了。谁的增援部队先到，谁就赢得这次战役的胜利。</p>
<p>普军的侧翼终于响起了枪击声。拿破仑深深地吸了一口气：&#8220;格鲁希终于来了！&#8221;他以为自己的侧翼现在已有了保护，于是集中了最后剩下的全部兵力，向威灵顿的主阵地再次发起攻击。这主阵地就是布鲁塞尔的门闩，必须将它摧毁，这主阵地就是欧洲的大门，必须将它冲破。</p>
<p>然而刚才那一阵枪声仅仅是一场误会。由于汉诺威兵团穿着别样的军装，前来的普军向汉诺威士兵开了枪。但这场误会的遭遇战很快就停止了。现在，普军的大批人马毫无阻挡地、浩浩荡荡地从树林里穿出来。厄运就此降临了。这一消息飞快地在拿破仑的部队中传开。部队开始退却。所有剩下的英军一下子全都跃身而起，向着溃退的敌人冲去。与此同时，普鲁士骑兵也从侧面向仓皇逃窜、疲于奔命的法军冲杀过去。</p>
<p>仅仅几分钟的工夫，这支赫赫军威的部队变成了一股被人驱赶的抱头鼠窜、惊慌失措的人流。在一片惊恐的混乱叫喊声中，他们轻而易举地捕获了拿破仑的御用马车和全军的贵重财物，俘虏了全部炮兵。只是由于黑夜的降临，才拯救了拿破仑的性命和自由。一直到半夜，满身污垢、头昏目眩的拿破仑才在一家低矮的乡村客店里，疲倦地躺坐在扶手软椅上，这时，他已不再是个皇帝了。他的帝国、他的皇朝、他的命运全完了。一个微不足道的小人物的怯懦毁坏了他这个最有胆识、最有远见的人物在20年里所建立起来的全部英雄业绩。</p>
<p>那关键的一秒钟就是这样进行了可怕的报复。在尘世生活中，这样的一瞬间是很少降临的。当它无意之中降临到一个人身上时，他却不知如何利用它。在命运降临的伟大瞬间，市民的一切美德——小心、顺从、勤勉、谨慎，都无济于事，它始终只要求天才人物，并且将他造就成不朽的形象。命运鄙视地把畏首畏尾的人拒之门外。命运——这世上的另一位神，只愿意用热烈的双臂把勇敢者高高举起，送上英雄们的天堂。</p>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/28261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2007-07-18 10:42 <a href="http://www.cppblog.com/bloodsuck/archive/2007/07/18/28261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1个形式怪异的函数</title><link>http://www.cppblog.com/bloodsuck/archive/2007/06/12/26156.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Tue, 12 Jun 2007 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2007/06/12/26156.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/26156.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2007/06/12/26156.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/26156.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/26156.html</trackback:ping><description><![CDATA[<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><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;backarry(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;arrayname&nbsp;)[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">])&nbsp;)&nbsp;&nbsp;[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;arrayname;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 呵呵，是有点古怪 <br><br>&nbsp; 再来个<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">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;backarry(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;arrayname&nbsp;)[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">])&nbsp;)&nbsp;&nbsp;[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;arrayname;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;&nbsp;backarry(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;arrayname)[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]))[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">i;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;arrayname;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>backarry(</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">);</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">会调用哪个呢？？<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}</span></div>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/26156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2007-06-12 16:09 <a href="http://www.cppblog.com/bloodsuck/archive/2007/06/12/26156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个 Decorator 模式 例子（原）</title><link>http://www.cppblog.com/bloodsuck/archive/2007/03/22/20338.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Thu, 22 Mar 2007 01:56:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2007/03/22/20338.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/20338.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2007/03/22/20338.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/20338.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/20338.html</trackback:ping><description><![CDATA[
		<p> </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>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#pragma once<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />class component<br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    component(void);<br /></span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  virtual void printsefl()</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">   ;<br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    virtual ~component(void);<br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />class concreatecom :</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> component<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    concreatecom(char</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> );<br /></span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  virtual void printsefl()   ;<br /></span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  virtual ~concreatecom(void);<br /></span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">20</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> _psz_text;<br /></span>
				<span style="COLOR: #008080">21</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span>
				<span style="COLOR: #008080">22</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">23</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />class decorator:</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> component<br /></span>
				<span style="COLOR: #008080">24</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">25</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">26</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     decorator(component</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">27</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  virtual void printsefl()     ;<br /></span>
				<span style="COLOR: #008080">28</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  virtual ~decorator();<br /></span>
				<span style="COLOR: #008080">29</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span>
				<span style="COLOR: #008080">30</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">31</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">32</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   component </span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> _pcomponent;<br /></span>
				<span style="COLOR: #008080">33</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span>
				<span style="COLOR: #008080">34</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />class  headdeco:</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> decorator<br /></span>
				<span style="COLOR: #008080">35</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">36</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">37</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       headdeco(component</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">38</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   virtual void printsefl()   ;<br /></span>
				<span style="COLOR: #008080">39</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   virtual ~headdeco();<br /></span>
				<span style="COLOR: #008080">40</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span>
				<span style="COLOR: #008080">41</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    virtual void printhead()  ;<br /></span>
				<span style="COLOR: #008080">42</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">43</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> _i_head;<br /></span>
				<span style="COLOR: #008080">44</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />};<br /></span>
				<span style="COLOR: #008080">45</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">46</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />class enddeco:</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> decorator<br /></span>
				<span style="COLOR: #008080">47</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">48</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">49</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />      enddeco(component</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">,char</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">50</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    virtual void printsefl() ;<br /></span>
				<span style="COLOR: #008080">51</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    virtual  ~enddeco();<br /></span>
				<span style="COLOR: #008080">52</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />protected:<br /></span>
				<span style="COLOR: #008080">53</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />      virtual void printend() ;<br /></span>
				<span style="COLOR: #008080">54</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">:<br /></span>
				<span style="COLOR: #008080">55</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> char</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> _pch_end;<br /></span>
				<span style="COLOR: #008080">56</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />};</span>
		</div>
		<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>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">StdAfx.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#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"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">component.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />using namespace std;<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />component::component(void)<br /></span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />component::~component(void)<br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void concreatecom::printsefl() <br /></span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /></span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">_psz_text ;<br /></span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /></span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">20</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> concreatecom::concreatecom(char</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> psz)<br /></span>
				<span style="COLOR: #008080">21</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">22</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />      _psz_text</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">psz;<br /></span>
				<span style="COLOR: #008080">23</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">24</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> decorator::decorator(component</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> a):<br /></span>
				<span style="COLOR: #008080">25</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   _pcomponent(a)<br /></span>
				<span style="COLOR: #008080">26</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">27</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  <br /></span>
				<span style="COLOR: #008080">28</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">29</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />concreatecom::~concreatecom()<br /></span>
				<span style="COLOR: #008080">30</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">31</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">32</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">33</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void decorator::printsefl()<br /></span>
				<span style="COLOR: #008080">34</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">35</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />_pcomponent.printsefl();<br /></span>
				<span style="COLOR: #008080">36</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    <br /></span>
				<span style="COLOR: #008080">37</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">38</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">39</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />decorator::~decorator()<br /></span>
				<span style="COLOR: #008080">40</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">41</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">42</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">43</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">44</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> headdeco::headdeco(component </span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> refcom, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> i):<br /></span>
				<span style="COLOR: #008080">45</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  decorator(refcom)<br /></span>
				<span style="COLOR: #008080">46</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> ,_i_head(i)<br /></span>
				<span style="COLOR: #008080">47</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">48</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">49</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">50</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void headdeco::printsefl() <br /></span>
				<span style="COLOR: #008080">51</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{ <br /></span>
				<span style="COLOR: #008080">52</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   printhead();<br /></span>
				<span style="COLOR: #008080">53</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   decorator::printsefl();<br /></span>
				<span style="COLOR: #008080">54</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   <br /></span>
				<span style="COLOR: #008080">55</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">56</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void headdeco::printhead() <br /></span>
				<span style="COLOR: #008080">57</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">58</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /></span>
				<span style="COLOR: #008080">59</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">_i_head;<br /></span>
				<span style="COLOR: #008080">60</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /></span>
				<span style="COLOR: #008080">61</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">62</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />headdeco::~headdeco()<br /></span>
				<span style="COLOR: #008080">63</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">64</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> <br /></span>
				<span style="COLOR: #008080">65</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">66</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">67</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />enddeco::enddeco(component </span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> refcom,char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> pch)<br /></span>
				<span style="COLOR: #008080">68</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />:decorator(refcom)<br /></span>
				<span style="COLOR: #008080">69</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />,_pch_end(pch)<br /></span>
				<span style="COLOR: #008080">70</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">71</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />   <br /></span>
				<span style="COLOR: #008080">72</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">73</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void enddeco::printsefl() <br /></span>
				<span style="COLOR: #008080">74</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">75</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    decorator::printsefl();<br /></span>
				<span style="COLOR: #008080">76</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    printend();<br /></span>
				<span style="COLOR: #008080">77</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">78</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void enddeco::printend()  <br /></span>
				<span style="COLOR: #008080">79</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">80</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /></span>
				<span style="COLOR: #008080">81</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">_pch_end;<br /></span>
				<span style="COLOR: #008080">82</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br /></span>
				<span style="COLOR: #008080">83</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">84</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />enddeco::~enddeco()<br /></span>
				<span style="COLOR: #008080">85</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">86</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">87</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}</span>
		</div>
		<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>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">//</span>
				<span style="COLOR: #000000"> decorator.cpp : 定义控制台应用程序的入口点。<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">//</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">stdafx.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#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">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">component.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />using namespace std;<br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> void printmodel(component</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> pcom )<br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    pcom.printsefl();<br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> _tmain(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> argc, _TCHAR</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> argv[])<br /></span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     <br /></span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    printmodel(headdeco(headdeco(enddeco(concreatecom(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">正文输出中。。。。</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">),</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">黄大仙</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">),</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">),</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">));<br /></span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    return </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>
				<br />
				<br />       这个decorator 模式例子让初学者 更能加深 多态威力的体会和 decorator 模式 比子类灵活的体会<br />要注意的问题是：对象链总是在 concreatecomponent  对象处结束。<br /><br />  ///此处是client 使用 对象的入口点，仅仅得到了 1个 decorator 的派生类对象，client 什么都不知道<br />printmodel(headdeco(headdeco(enddeco(concreatecom("正文输出中。。。。"),"黄大仙"),2),1));<br />///<br /></p>
		<p>     在vc2005 下通过<br /></p>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/20338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2007-03-22 09:56 <a href="http://www.cppblog.com/bloodsuck/archive/2007/03/22/20338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL container  </title><link>http://www.cppblog.com/bloodsuck/archive/2006/09/18/12667.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Mon, 18 Sep 2006 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/09/18/12667.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/12667.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/09/18/12667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/12667.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/12667.html</trackback:ping><description><![CDATA[    
<p>Containers in STL can be divided into three categories:<br />1.sequence containers,<br />2.associative containers,<br />3.container adapters. <br /><br />1.Sequence Containers</p><div class="section" id="sectionSection0" name="collapseableSection"><p>Sequence containers maintain the original ordering of inserted elements. This allows you to specify where to insert the element in the container.</p><p>The <b>deque</b> (double-ended queue) container allows for fast insertions and deletions at the beginning and end of the container. You can also randomly access any element quickly.</p><p>The <b>list</b> container allows for fast insertions and deletions anywhere in the container, but you cannot randomly access an element in the container.</p><p>The <b>vector</b> container behaves like an array, but will automatically grow as required.</p><p>For more information on the sequence containers, consult the following table:</p><div class="labelheading"><b></b></div><div class="tableSection"><table cellspacing="2" cellpadding="5" width="100%"><tbody><tr><th>Sequence Container </th><th>Native STL </th></tr><tr><td><p><b>deque</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/64842ee5-057a-4063-8c16-4267a0332584.htm"><font color="#002c99">deque Class</font></a></p></td></tr><tr><td><p><b>ilist</b></p></td><td><p>Not Applicable</p></td></tr><tr><td><p><b>list</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/d3707f4a-10fd-444f-b856-f9ca2077c1cd.htm"><font color="#002c99">list Class</font></a></p></td></tr><tr><td><p><b>vector</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/a3e0a8f8-7565-4fe0-93e4-e4d74ae1b70d.htm"><font color="#002c99">vector Class</font></a><br /></p></td></tr></tbody></table></div></div>2.Associative Containers 
<div class="section" id="sectionSection1" name="collapseableSection"><p>The defining characteristic of associative containers is that elements are inserted in a pre-defined order, such as sorted ascending.</p><p>The associative containers can be grouped into two subsets: maps and sets. A <b>map</b>, sometimes referred to as a dictionary, consists of a key/value pair. The key is used to order the sequence, and the value is somehow associated with that key. For example, a <b>map</b> might contain keys representing every unique word in a text and values representing the number of times that word appears in the text. A <b>set</b> is simply an ascending container of unique elements.</p><p>Both <b>map</b> and <b>set</b> only allow one instance of a key or element to be inserted into the container. If multiple instances of elements are required, use <b>multimap</b> or <b>multiset</b>.</p><p>Both maps and sets support bidirectional iterators. For more information on iterators, see <a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/2f746be7-b37d-4bfc-bf05-be4336ca982f.htm"><font color="#002c99">Iterators</font></a>.</p><p>While not officially part of the STL standard, <b>hash_map</b> and <b>hash_set</b> are commonly used to improve searching times. These containers store their elements as a hash table, with each table entry containing a bidirectional linked list of elements. To ensure the fastest search times, make sure that the hashing algorithm for your elements returns evenly distributed hash values.</p><p>For more information on the associative containers, consult the following table:</p><div class="labelheading"><b></b></div><div class="tableSection"><table cellspacing="2" cellpadding="5" width="100%"><tbody><tr><th>Associative Container </th><th>Native STL </th></tr><tr><td><p><b>hash_map</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/40879dfc-51ba-4a59-9f9e-26208de568a8.htm"><font color="#002c99">hash_map Class</font></a></p></td></tr><tr><td><p><b>hash_multimap</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/f41a6db9-67aa-43a3-a3c5-dbfe9ec3ae7d.htm"><font color="#002c99">hash_multimap Class</font></a></p></td></tr><tr><td><p><b>hash_multiset</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/0580397a-a76e-40ad-aea2-5c6f3a9d0a21.htm"><font color="#002c99">hash_multiset Class</font></a></p></td></tr><tr><td><p><b>hash_set</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/c765c06e-cbb6-48c2-93ca-d15468eb28d7.htm"><font color="#002c99">hash_set Class</font></a></p></td></tr><tr><td><p><b>map</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/7876f4c9-ebb4-4878-af1e-09364c43af0a.htm"><font color="#002c99">map Class</font></a></p></td></tr><tr><td><p><b>multimap</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/8796ae05-37c4-475a-9e61-75fde9d4a463.htm"><font color="#002c99">multimap Class</font></a></p></td></tr><tr><td><p><b>multiset</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/630e8c10-0ce9-4ad9-8d79-9e91a600713f.htm"><font color="#002c99">multiset Class</font></a></p></td></tr><tr><td><p><b>set</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/8991f9aa-5509-4440-adc1-371512d32018.htm"><font color="#002c99">set Class</font></a></p></td></tr></tbody></table></div></div><br /><br />3.Container Adapters 
<div class="section" id="sectionSection2" name="collapseableSection"><p>The container adapters are simply variations of the above containers. The container adapters do not support iterators.</p><p>The <b>priority_queue</b> container organized such that the element with the highest value is always first in the queue.</p><p>The <b>queue</b> container follows FIFO (first in, first out) semantics. The first element inserted (pushed) into the queue is the first to be removed (popped).</p><p>The <b>stack</b> container follows LIFO (last in, first out) semantics. The last element to be inserted (pushed) on the stack is the first element to be removed (popped).</p><p>Since container adapters do not support iterators, they cannot be used with the STL algorithms. For more information on algorithms, see <a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/dec9b373-7d5c-46cc-b7d2-21a938ecd0a6.htm"><font color="#002c99">Algorithms</font></a>.</p><p>For more information on the container adapters, consult the following table:</p><div class="labelheading"><b></b></div><div class="tableSection"><table cellspacing="2" cellpadding="5" width="100%"><tbody><tr><th>Container Adapter </th><th>Native STL </th></tr><tr><td><p><b>priority_queue</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/69fca9cc-a449-4be4-97b7-02ca5db9cbb2.htm"><font color="#002c99">priority_queue Class</font></a></p></td></tr><tr><td><p><b>queue</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/28c20ab0-3a72-4185-9e0f-5a44eea0e204.htm"><font color="#002c99">queue Class</font></a></p></td></tr><tr><td><p><b>stack</b></p></td><td><p><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcstdlib/html/02151c1e-eab0-41b8-be94-a839ead78ecf.htm"><font color="#002c99">stack Class</font></a></p></td></tr></tbody></table></div></div><br /><br /><br />Requirements for Container Elements 
<div class="section" id="sectionSection3" name="collapseableSection"><p>Elements inserted into an STL container can be of any object type that supplies a public copy constructor, a public <br />                                      public 拷贝构造 ，public 析构 ,public 赋值操作符   elem&amp; operator =( elem const &amp;)<br />destructor, and a public assignment operator. The destructor may not throw an exception. Furthermore, associative <br />                                                                       析构不能抛出异常<br />containers such as <b>set</b> and <b>map</b> must have a public comparison operator defined, which is operator&lt; by default. Some <br />                             关联容器  除此外 还应由有 比较操作符<br />                  operations on containers might also require a public default constructor and a public equivalence operator.<br /><br /><br /><br /><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><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">deque</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">map</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></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"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />template </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename inputitrator </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> predict(inputitrator  a)<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_166_267_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_267_Open_Text.style.display='none'; Codehighlighter1_166_267_Closed_Image.style.display='inline'; Codehighlighter1_166_267_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_166_267_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_166_267_Closed_Text.style.display='none'; Codehighlighter1_166_267_Open_Image.style.display='inline'; Codehighlighter1_166_267_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_166_267_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_166_267_Open_Text"><span style="COLOR: #000000">{   iterator_traits</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">inputitrator</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterato_category  b;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   <br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> endl</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">typeid(b).name();<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />main()<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img id="Codehighlighter1_279_479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_279_479_Open_Text.style.display='none'; Codehighlighter1_279_479_Closed_Image.style.display='inline'; Codehighlighter1_279_479_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_279_479_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_279_479_Closed_Text.style.display='none'; Codehighlighter1_279_479_Open_Image.style.display='inline'; Codehighlighter1_279_479_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_279_479_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_279_479_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> a;<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  deque</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> b;<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> c;<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> d;<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> e;<br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  <br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   predict(a.begin());<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   predict(b.begin());<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   predict(c.begin());<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    predict(d.begin());<br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     predict(e.begin());<br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div></div><pre>output iterator
   -&gt; forward iterator
   -&gt; bidirectional iterator
   -&gt; random-access iterator<br /><br /><pre>input iterator
   -&gt; forward iterator
   -&gt; bidirectional iterator
   -&gt; random-access iterator</pre></pre><img src ="http://www.cppblog.com/bloodsuck/aggbug/12667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-09-18 10:43 <a href="http://www.cppblog.com/bloodsuck/archive/2006/09/18/12667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC 中 命令消息传递 （原创）</title><link>http://www.cppblog.com/bloodsuck/archive/2006/07/27/10575.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Thu, 27 Jul 2006 03:27:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/07/27/10575.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/10575.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/07/27/10575.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/10575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/10575.html</trackback:ping><description><![CDATA[                        先对对于mfc中的命令消息路由的机制原理作个简单的总结：<br />      CCmdTarget 为 模板 ，提供： CCmdTarget::OnCmdMsg() 这个函数 对 其派生类 的消息结构数组（它是静态的）做搜索 并向上（基类）的结构数组做搜索并调用相应的成员函数。<br />   派生类使用 <br /> DECLARE_MESSAGE_MAP()<br />BEGIN_MESSAGE_MAP(本类, 基类)<br /> ON_COMMAND(ID_APP_ABOUT, OnAppAbout)<br />END_MESSAGE_MAP()<br />加入链表<br /><br />        AfxWndProc （只有发向窗口才会被调用），此函数 将使用HWND 在 mfc库的全局变量中<br />找到句柄映射表，转为 CWnd 型 ，最终使用 派生类的对OnCmdMsg()的重载 来实现 不同的路由<br /><br />     以上原理<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><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> CMan : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> CCmdTarget<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_31_284_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_284_Open_Text.style.display='none'; Codehighlighter1_31_284_Closed_Image.style.display='inline'; Codehighlighter1_31_284_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_31_284_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_284_Closed_Text.style.display='none'; Codehighlighter1_31_284_Open_Image.style.display='inline'; Codehighlighter1_31_284_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_31_284_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_31_284_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    DECLARE_DYNAMIC(CMan)<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    CMan();<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CMan();<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    DECLARE_MESSAGE_MAP()<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    afx_msg </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnAppAbout();<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> BOOL OnCmdMsg(UINT nID, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCode, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pExtra, AFX_CMDHANDLERINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pHandlerInfo);<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> m_id;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    CString m_name;<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img id="Codehighlighter1_286_357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_286_357_Open_Text.style.display='none'; Codehighlighter1_286_357_Closed_Image.style.display='inline'; Codehighlighter1_286_357_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_286_357_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_286_357_Closed_Text.style.display='none'; Codehighlighter1_286_357_Open_Image.style.display='inline'; Codehighlighter1_286_357_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span><span id="Codehighlighter1_286_357_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_286_357_Open_Text"><span style="COLOR: #808080">////////////</span><span style="COLOR: #008000">自定义的c++类<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #808080">///////////////</span><span style="COLOR: #008000">/重载 onCmdMsg，（m_man为CMainFram的成员）</span><span style="COLOR: #808080"></span></span><br /><span style="COLOR: #008080">20</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BOOL CMainFrame::OnCmdMsg(UINT nID, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCode, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pExtra, AFX_CMDHANDLERINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pHandlerInfo)<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img id="Codehighlighter1_453_656_Open_Image" onclick="this.style.display='none'; Codehighlighter1_453_656_Open_Text.style.display='none'; Codehighlighter1_453_656_Closed_Image.style.display='inline'; Codehighlighter1_453_656_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_453_656_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_453_656_Closed_Text.style.display='none'; Codehighlighter1_453_656_Open_Image.style.display='inline'; Codehighlighter1_453_656_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_453_656_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_453_656_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: 在此添加专用代码和/或调用基类</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">          </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (m_man.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo ))<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img id="Codehighlighter1_556_587_Open_Image" onclick="this.style.display='none'; Codehighlighter1_556_587_Open_Text.style.display='none'; Codehighlighter1_556_587_Closed_Image.style.display='inline'; Codehighlighter1_556_587_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_556_587_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_556_587_Closed_Text.style.display='none'; Codehighlighter1_556_587_Open_Image.style.display='inline'; Codehighlighter1_556_587_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />          </span><span id="Codehighlighter1_556_587_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_556_587_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />          }</span></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);<br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img id="Codehighlighter1_658_684_Open_Image" onclick="this.style.display='none'; Codehighlighter1_658_684_Open_Text.style.display='none'; Codehighlighter1_658_684_Closed_Image.style.display='inline'; Codehighlighter1_658_684_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_658_684_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_658_684_Closed_Text.style.display='none'; Codehighlighter1_658_684_Open_Image.style.display='inline'; Codehighlighter1_658_684_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_658_684_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_658_684_Open_Text"><span style="COLOR: #808080">////////////</span><span style="COLOR: #008000">//给CMan 加个命令响应</span><span style="COLOR: #808080"></span></span><br /><span style="COLOR: #008080">31</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BEGIN_MESSAGE_MAP(CMan, CCmdTarget)<br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)<br /></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />END_MESSAGE_MAP()<br /></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> CMan 消息处理程序</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">38</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CMan::OnAppAbout()<br /></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img id="Codehighlighter1_820_919_Open_Image" onclick="this.style.display='none'; Codehighlighter1_820_919_Open_Text.style.display='none'; Codehighlighter1_820_919_Closed_Image.style.display='inline'; Codehighlighter1_820_919_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_820_919_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_820_919_Closed_Text.style.display='none'; Codehighlighter1_820_919_Open_Image.style.display='inline'; Codehighlighter1_820_919_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_820_919_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_820_919_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: 在此添加命令处理程序代码</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">42</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    CString str;<br /></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    str.Format(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,m_id);<br /></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    str</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">m_name;<br /></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    AfxMessageBox(str);<br /></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img id="Codehighlighter1_921_932_Open_Image" onclick="this.style.display='none'; Codehighlighter1_921_932_Open_Text.style.display='none'; Codehighlighter1_921_932_Closed_Image.style.display='inline'; Codehighlighter1_921_932_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_921_932_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_921_932_Closed_Text.style.display='none'; Codehighlighter1_921_932_Open_Image.style.display='inline'; Codehighlighter1_921_932_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_921_932_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_921_932_Open_Text"><span style="COLOR: #808080">/////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"></span></span><br /><span style="COLOR: #008080">48</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />运行后就会发现 此命令将由CMan::onAppAbout() 来 <br /></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />响应</span></div><img src ="http://www.cppblog.com/bloodsuck/aggbug/10575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-07-27 11:27 <a href="http://www.cppblog.com/bloodsuck/archive/2006/07/27/10575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>聚合</title><link>http://www.cppblog.com/bloodsuck/archive/2006/07/05/9422.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 05 Jul 2006 03:45:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/07/05/9422.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/9422.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/07/05/9422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/9422.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/9422.html</trackback:ping><description><![CDATA[            重用的另一种方法<br />      a 聚合 b<br />    b 要有必要的支持才能实现，具体过程如：<br />     a, cocreateinstance,指定 自己的IUnknown  ,并必须在iid,ppv中指定是 IID__IUnknown ,IUnknown*（被聚合的com类的 非委托IUnknown）<br />此时 被聚合类 在类厂（createinstance 中 接收 a的 IUnknown  并在 b 的成员中赋好值）支持下，被创建<br />的com类 被创建。<br />      b 中 2组 IUnknown 接口：委托（聚合） 和   非委托（正常）<br />    在a 中获取 IUnknown接口（b的），请求 其他 接口时 ( a把 客户发出的对b 的接口请求 转到  a 获取<br /> IUnknown 接口 调用 queryinterface ),全部使用  b 对象 的  委托接口  来判断  是把接口请求 转到 <br />非委托 还是 外部  a 的IUnknown<br /><img src ="http://www.cppblog.com/bloodsuck/aggbug/9422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-07-05 11:45 <a href="http://www.cppblog.com/bloodsuck/archive/2006/07/05/9422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个包容重用</title><link>http://www.cppblog.com/bloodsuck/archive/2006/07/04/9383.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Tue, 04 Jul 2006 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/07/04/9383.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/9383.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/07/04/9383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/9383.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/9383.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1								#pragma once				  2																		static				 				const				 GUID CLSID_mydiv 				=				 				  3																																												{ 			...&nbsp;&nbsp;<a href='http://www.cppblog.com/bloodsuck/archive/2006/07/04/9383.html'>阅读全文</a><img src ="http://www.cppblog.com/bloodsuck/aggbug/9383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-07-04 16:20 <a href="http://www.cppblog.com/bloodsuck/archive/2006/07/04/9383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Run time type Information</title><link>http://www.cppblog.com/bloodsuck/archive/2006/07/04/9360.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Tue, 04 Jul 2006 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/07/04/9360.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/9360.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/07/04/9360.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/9360.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/9360.html</trackback:ping><description><![CDATA[
		<dd>
				<b>
						<br />一                 dynamic_cast</b>
				<b>&lt;</b>
				<i> type-id</i>
				<b> &gt;</b>
				<b>(</b>
				<i>expression </i>
				<b>)</b>
				<br />  type-id :必须是指针或者引用<br />  expression:必须是指针或者一个左值<br />基本上是用来做 子对象间的转换<br />1.基本的用法<br /><pre class="code">class B { ... };
class C : public B { ... };
class D : public C { ... };

void f(D* pd)
{
   C* pc = dynamic_cast&lt;C*&gt;(pd);   // ok: C is a direct base class
                                 // pc points to C subobject of pd 

   B* pb = dynamic_cast&lt;B*&gt;(pd);   // ok: B is an indirect base class
                                 // pb points to B subobject of pd 
   ...
}</pre><p>This type of conversion is called an "upcast" because it moves a pointer up a class hierarchy, from a derived class to a class it is derived from. An upcast is an implicit conversion.</p><p>If <i>type-id</i> is void*, a run-time check is made to determine the actual type of <i>expression</i>. The result is a pointer to the complete object pointed to by <i>expression</i>. For example:</p><pre class="code">class A { ... };

class B { ... };

void f()
{
   A* pa = new A;
   B* pb = new B;
   void* pv = dynamic_cast&lt;void*&gt;(pa);
   // pv now points to an object of type A
   ...
   pv = dynamic_cast&lt;void*&gt;(pb);
   // pv now points to an object of type B
}</pre><p>If <i>type-id</i> is not void*, a run-time check is made to see if the object pointed to by <i>expression</i> can be converted to the type pointed to by <i>type-id</i>.</p><p>If the type of <i>expression</i> is a base class of the type of <i>type-id</i>, a run-time check is made to see if <i>expression</i> actually points to a complete object of the type of <i>type-id</i>. If this is true, the result is a pointer to a complete object of the type of <i>type-id</i>. For example:</p><pre class="code">class B { ... };
class D : public B { ... };

void f()
{
   B* pb = new D;                     // unclear but ok
   B* pb2 = new B;

   D* pd = dynamic_cast&lt;D*&gt;(pb);      // ok: pb actually points to a D
   ...
   D* pd2 = dynamic_cast&lt;D*&gt;(pb2);   // pb2 points to a B not a D
                                    // cast was bad so pd2 == NULL
   ...
}</pre><p>This type of conversion is called a "downcast" because it moves a pointer down a class hierarchy, from a given class to a class derived from it.<br />小结：<br />  a     实际指向对象 和   b 目标对象,  b 是a 的 基类（子对象），或者是2者 同级转换才成功<br />否则 目标为NULL;也就是说不能向下转<br /><br /><br /><br />2   多重非虚的继承模式<br /><br /></p><p class="label"><b>Class Hierarchy Showing Multiple Inheritance</b></p><p class="fig"><img alt="" src="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vclang/html/vc39011.gif" border="0" /></p><p>A pointer to an object of type <code class="ce">D</code> can be safely cast to <code class="ce">B</code> or <code class="ce">C</code>. However, if <code class="ce">D</code> is cast to point to an <code class="ce">A</code> object, which instance of <code class="ce">A</code> would result? This would result in an ambiguous casting error. To get around this problem, you can perform two unambiguous casts. For example:</p><pre class="code">void f()
{
   D* pd = new D;
   A* pa = dynamic_cast&lt;A*&gt;(pd);      // error: ambiguous
   B* pb = dynamic_cast&lt;B*&gt;(pd);      // first cast to B
   A* pa2 = dynamic_cast&lt;A*&gt;(pb);   // ok: unambiguous
}</pre><p>Further ambiguities can be introduced when you use virtual base classes. Consider the class hierarchy shown in the following figure.</p><p>    也就是说在2意性下会失败<br />3.子对象间的转换<br /></p><p class="label"><b>Class Hierarchy Showing Duplicate Base Classes</b></p><p class="fig"><img alt="" src="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vclang/html/vc39013.gif" border="0" /><br />    //pd 指向 e 对象<br />void f(D* pd)<br />{<br />   E* pe = dynamic_cast&lt;E*&gt;(pd);<br />   B* pb = pe;      // upcast, implicit conversion<br />   A* pa = pb;      // upcast, implicit conversion<br />}<br /><br />//pd 指向 e 对象<br />void f(D* pd)<br />{<br />   B* pb = dynamic_cast&lt;B*&gt;(pd);      // cross cast<br />   A* pa = pb;                  // upcast, implicit conversion<br />}<br /><br />  也就是  所谓 cross cast <br /><br />二  <b>typeid( </b><i>type-id</i><b> )     </b><b>typeid( </b><i>expression</i><b> )</b> <br />   此操作符返回个  const type_info &amp; <br />            expression 必须指向一个多态类型（带虚函数    ），并且要解引用<br /><br />#include &lt;iostream&gt;<br />#include &lt;typeinfo.h&gt;</p></dd>
		<dd>
				<p class="fig">class Base {<br />public:<br />   virtual void vvfunc() {}<br />};</p>
		</dd>
		<dd>
				<p class="fig">class Derived : public Base {};</p>
		</dd>
		<dd>
				<p class="fig">using namespace std;<br />int main()<br />{<br />   Derived* pd = new Derived;<br />   Base* pb = pd;<br />   cout &lt;&lt; typeid( pb ).name() &lt;&lt; endl;   //prints "class Base *"<br />   cout &lt;&lt; typeid( *pb ).name() &lt;&lt; endl;   //prints "class Derived"<br />   cout &lt;&lt; typeid( pd ).name() &lt;&lt; endl;   //prints "class Derived *"<br />   cout &lt;&lt; typeid( *pd ).name() &lt;&lt; endl;   //prints "class Derived"<br />   delete pd;<br />}<br />// compile with: /GR /EHsc<br /><br />在模版中使用<br />template &lt; typename T &gt; T max( T arg1, T arg2 ) {<br />   cout &lt;&lt; typeid( T ).name() &lt;&lt; "s compared." &lt;&lt; endl;<br />   return ( arg1 &gt; arg2 ? arg1 : arg2 );<br />}<br /><br /><br />            </p>
		</dd>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/9360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-07-04 10:23 <a href="http://www.cppblog.com/bloodsuck/archive/2006/07/04/9360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个com组件的练习</title><link>http://www.cppblog.com/bloodsuck/archive/2006/06/30/9244.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Fri, 30 Jun 2006 09:23:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/06/30/9244.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/9244.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/06/30/9244.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/9244.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/9244.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //				 {7B55D765-68A6-404e-99E2-CA9ABC389A27}																								static				 				const				  GUID IID_IUnknown9				=				 																								{ 						0x7b55d765...&nbsp;&nbsp;<a href='http://www.cppblog.com/bloodsuck/archive/2006/06/30/9244.html'>阅读全文</a><img src ="http://www.cppblog.com/bloodsuck/aggbug/9244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-06-30 17:23 <a href="http://www.cppblog.com/bloodsuck/archive/2006/06/30/9244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC中 windows object 和 C++ object</title><link>http://www.cppblog.com/bloodsuck/archive/2006/06/30/9222.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Fri, 30 Jun 2006 03:33:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/06/30/9222.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/9222.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/06/30/9222.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/9222.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/9222.html</trackback:ping><description><![CDATA[
		<p class="label">
				<b>The Problem</b>
		</p>
		<p>Windows objects are normally represented by <b>HANDLE</b>s. The MFC classes wrap Windows object handles with C++ objects. The handle wrapping functions of the MFC class library provide a way to find the C++ object that is wrapping the Windows object with a particular handle. There are times when a Windows object does not have a C++ wrapper object, however, and at these times a temporary object is created to act as the C++ wrapper.<br /></p>
		<p>mfc 映射的 windows object ----&gt;c++ wrapper<br />以下使用 mfc 的函数 如：fromhandle, getdlgitem,都会返回temporary 和 pemanent  c++ wrapper object<br /> 注意：<br />     零时的 对象 会被在空闲时(<strong>OnIdle()函数)</strong>被删除，不能存下在下次消息处理中 使用<br />The default <b>OnIdle</b> processing in <b>CWinThread</b> automatically calls <b>DeleteTempMap</b> for each class that supports temporary handle maps<br />////////////////////////////////////////////////////////////<br />The Windows objects that use handle maps are: 
</p>
		<ul type="disc">
				<li>
						<b>HWND</b> (<b>CWnd</b> and <b>CWnd</b>-derived classes) 
</li>
				<li>
						<b>HDC</b> (<b>CDC</b> and <b>CDC</b>-derived classes) 
</li>
				<li>
						<b>HMENU</b> (<b>CMenu</b>) 
</li>
				<li>
						<b>HPEN</b> (<b>CGdiObject</b>) 
</li>
				<li>
						<b>HBRUSH</b> (<b>CGdiObject</b>) 
</li>
				<li>
						<b>HFONT</b> (<b>CGdiObject</b>) 
</li>
				<li>
						<b>HBITMAP</b> (<b>CGdiObject</b>) 
</li>
				<li>
						<b>HPALETTE</b> (<b>CGdiObject</b>) 
</li>
				<li>
						<b>HRGN</b> (<b>CGdiObject</b>) 
</li>
				<li>
						<b>HIMAGELIST</b> (<b>CImageList</b>) 
</li>
				<li>
						<b>SOCKET</b> (<b>CSocket</b>) </li>
		</ul>
		<p>///////////////////////////////////////////////</p>
		<p>Given a handle to any of these objects, you can find the MFC object that wraps the handle by calling the static member function <b>FromHandle</b>. For example, given an <b>HWND</b> called <i>hWnd</i>:</p>
		<pre class="code">CWnd::FromHandle(hWnd)</pre>
		<p>will return a pointer to the <b>CWnd</b> that wraps the <i>hWnd</i>. If that <i>hWnd</i> does not have a specific wrapper object, then a temporary <b>CWnd</b> is created to wrap the <b>hWnd</b>. This makes it possible to get a valid C++ object from any handle.</p>
		<p>Once you have a wrapper object, you can get to its handle through a public member variable. In the case of a <b>CWnd</b>, <i>m_hWnd</i> contains the <b>HWND</b> for that object.</p>
		<p class="label">
				<b>Attaching Handles to MFC Objects</b>
		</p>
		<p>Given a newly created handle-wrapper object and a handle to a Windows object, you can associate the two by calling <b>Attach</b>. For example:</p>
		<pre class="code">CWnd myWnd;
myWnd.Attach(hWnd);<br />  ////mywnd 析构时会调用 destroywindow ,连同 hwnd 一起销毁<br /><br /><br /><br /><br /></pre>
		<p>This makes an entry in the permanent map associating <i>myWnd</i> and <i>hWnd</i>. <br />Calling <b>CWnd::FromHandle</b>(<i>hWnd</i>) will now return a pointer to <i>myWnd</i>. <br />When <i>myWnd</i> is deleted, the destructor will automatically destroy the hWnd by calling the Windows <b>DestroyWindow</b> function. If this is not desired, the <i>hWnd</i> must be detached from <i>myWnd</i> before the <i>myWnd</i> object is destroyed (normally when leaving the scope at which <i>myWnd</i> was defined). The <b>Detach</b> member function does this.</p>
		<pre class="code">myWnd.Detach();</pre>
		<p class="label">
				<b>More About Temporary Objects</b>
		</p>
		<p>Temporary objects are created whenever <b>FromHandle</b> is given a handle that does not already have a wrapper object. These temporary objects are detached from their handle and deleted by the <b>DeleteTempMap</b> functions. The default <b>OnIdle</b> processing in <b>CWinThread</b> automatically calls <b>DeleteTempMap</b> for each class that supports temporary handle maps. This means that you cannot assume a pointer to a temporary object will be valid past the point of exit from the function where the pointer was obtained, as the temporary object will be deleted during the Windows message-loop idle time.</p>
		<p class="label">
				<b>很重要:<br />在多线程中传递 c++ wrapper object 是无效的(无论是 temporary 还是 permanent)<br />只能传递 windows handle, 换句话就是说， 线程 只能 访问 自己创建的c++ wrapper object<br /><br />Wrapper Objects and Multiple Threads</b>
		</p>
		<p>
				<font color="#ff0000">Both temporary and permanent objects are maintained on a per-thread basis. That is, one thread cannot access another threads C++ wrapper objects, regardless of whether it is temporary or permanent. As stated above, temporary objects are deleted when the thread which that temporary object belongs enters <b>OnIdle</b>.</font>
		</p>
		<p>
				<font color="#ff0000">To pass these objects from one thread to another, always send them as their native <b>HANDLE</b> type. Passing a C++ wrapper object from one thread to another will often result in unexpected results.</font>
		</p>
		<p>
				<font color="#ff0000">     </font>
		</p>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/9222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-06-30 11:33 <a href="http://www.cppblog.com/bloodsuck/archive/2006/06/30/9222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL 乱学二（原创）</title><link>http://www.cppblog.com/bloodsuck/archive/2006/06/02/8084.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Fri, 02 Jun 2006 07:43:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/06/02/8084.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/8084.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/06/02/8084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/8084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/8084.html</trackback:ping><description><![CDATA[1.容器<br />   顺序: vector(类似动态增长数组）  deque （双端队列）  list（双头指针）<br />   关联:set  multiset(有重复）  map   multiset（有重复） ，自动排序（内部2叉树）<br />  特殊预定义容器：stack, queue ,prority queue<br />2.迭代器<br />      每种容器都提供了自己的迭代器，相同的操作界面，不同的内部实现，<br />   *,-&gt;,==,!=,++,--共同操作<br />     随机iterator : 支持 &gt;，&lt;:如：vector, deque,string<br />    双向iterator:不支持&gt;,&lt;:<br />   特殊预定义：<br />插入迭代器<br />          insert iterator:引起自动增长，非覆盖<br />             back_inserter(container)<br />             front_inserter(container)<br />           inserter(container,pos)//调用 container.insert()//每种容器都具有insert()//关联容器唯一<br /> 流迭代器<br />             istream_iterator<br />             ostream_iterator<br /> 逆向迭代器<br />容器中元素应满足：<br />     有拷贝构造，赋值运算符，析构能销毁<br />   顺序：默认构造应该可用<br />   关联：必须有排序准则<br />容器中是 值不是引用<br /><br />通用操作：<br />   containertype c;<br />  ct  c(c1);<br />  ct   c(begin,end);<br /> c.~ct();<br /> c.size(), c.max_size(),c.empty(),c1==c2;c1&lt;c2;c1.swap(c2); swap(c1,c2);c.begin();c.end();c.rbegin();c.rend();<br />c.inert(pos,elem);c.erase(begin,end),c.clear(),c.get_allocator<br /> <br />     3.vector <br />    动态增长数组,在队尾插入，删除效率高<br />注意 动态增长时 迭代器失效 内部可能要重配置<br />除了clear(),vector 不会自动缩小<br />vector 的迭代器 就是 元素的native指针,连续存储，迭代器是个random <br />空判断<br />       a.begin==a.end<br /><br />4.list <br />   迭代器是个双向的，非连续存储，而且是个环状链表在尾端是个未初始化节点<br />空判断<br />   a.begin==a.end;<br />clear  remove  unique(把相同元素移出，留一个)  insert<br />只能使用成员函数 sort，不能使用 算法 sort(他只接受random iterator)<br />5 .deque<br />动态增长的双端队列 ，但内部机制和vector 不一样 ，若干连续存储的集合<br />算法复杂度高，如排序时可将 其复制到 vector中，头/尾插入/删除效率高  ，<br />提供随机迭代器<br />6.stack (container adapter)<br />先进后出，不供迭代器， 不提供走访功能<br />7.queue(container adapter)<br />  先进先出，不提供迭代器，不提供走访功能<br />8.heap 辅助<br />   其内部为一个完全2叉树，插入时自动排序，一般为max_heap<br />   左右无序，某节点 i, 父节点 i/2,左子节点 2i，右子节点 2i+1；<br /> <pre class="syntax"><b>template&lt;class RandomAccessIterator&gt; inline</b><b>   void make_heap(</b><b>      RandomAccessIterator </b><i>First</i><b>,</b><b>      RandomAccessIterator </b><i>Last</i><b>   )</b><b>template&lt;class RandomAccessIterator&gt; inline</b><b>   void sort_heap(</b><b>      RandomAccessIterator </b><i>First</i><b>,</b><b>      RandomAccessIterator </b><i>Last</i><b>   )</b><b>template&lt;class RandomAccessIterator&gt; inline</b><b>   void push_heap(</b><b>      RandomAccessIterator </b><i>First</i><b>,</b><b>      RandomAccessIterator </b><i>Last</i><b>   )</b><b>template&lt;class RandomAccessIterator&gt; inline</b><b>   void pop_heap(</b><b>      RandomAccessIterator </b><i>First</i><b>,</b><b>      RandomAccessIterator </b><i>Last</i><b>   )</b></pre>         <br />             9.set,关联容器 ，底层以rb-tree 实现，其迭代器为个const iterator<br />   不能用迭代器来改变 元素值，缺省下以递增排序<img src ="http://www.cppblog.com/bloodsuck/aggbug/8084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-06-02 15:43 <a href="http://www.cppblog.com/bloodsuck/archive/2006/06/02/8084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL 乱学一（原创）</title><link>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7950.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 31 May 2006 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7950.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/7950.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/7950.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/7950.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1								template 				&lt;				typename T1,typename T2				&gt;																		 2																		class				 mypair :				public				 pair				&lt;				T1,T2				&gt;...&nbsp;&nbsp;<a href='http://www.cppblog.com/bloodsuck/archive/2006/05/31/7950.html'>阅读全文</a><img src ="http://www.cppblog.com/bloodsuck/aggbug/7950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-05-31 16:53 <a href="http://www.cppblog.com/bloodsuck/archive/2006/05/31/7950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国内哪家哪家银行的缩写最牛!!!!!!!!!!!!!!!!!!! </title><link>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7937.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 31 May 2006 06:50:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7937.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/7937.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/7937.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/7937.html</trackback:ping><description><![CDATA[国内哪家哪家银行的缩写最牛!!!!!!!!!!!!!!!!!!! <br /><br />1.中国建设银行――CBC（Construction Bank of China） ――“存不存？” <br />2.中国银行――BC（Bank of China） ――“不存！” <br />3.中国农业银行――ABC（Agriculture Bank of China） ――“啊，不存。” <br />4.中国工商银行――ICBC ―― “爱存不存。” <br />5.民生银行――CMSB ――“存吗？SB” <br />6.招商银行――CMBC ――“存吗？？白 痴！” <br />7. 兴业银行――CIB ――“存一百” <br />8. 国家开发银行――CDB ――存点吧！ <br />9.“ 北京市商业银行――BCCB ――白存存不？” <br />10.汇丰银行――HSBC ――“还是不存。” <br /><div class="bbs_bodyinfo" id="bodyinfo_14832889_264973"> </div><!-- 日志 start --><img src ="http://www.cppblog.com/bloodsuck/aggbug/7937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-05-31 14:50 <a href="http://www.cppblog.com/bloodsuck/archive/2006/05/31/7937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++书籍下（转载）</title><link>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7936.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 31 May 2006 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7936.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/7936.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7936.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/7936.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/7936.html</trackback:ping><description><![CDATA[
		<font face="Verdana"> 我在上篇中“盘点”了TCPL和D&amp;E以及入门教程、高效和健壮编程、模板和泛型编程等方面共十几本C++好书。冬去春来，让我们继续C++书籍精彩之旅J  </font>
		<p>
				<font face="Verdana">标准库  </font>
		</p>
		<p>
				<font face="Verdana">当我还在研究院工作时，与同院另外两家研究所合作开发过一个大型水利枢纽调度集成项目。我们三家软件系统之间都要相互通信。在调试通讯模块时，细心的客户（一名好学的系统管理员）发现对于同一通信规约的解释代码，我的不超过30行，而对方的则超过了150行且很难看懂。这位系统管理员很纳闷，我说大家编程风格和习惯不一样，我使用了标准库，而他使用了传统C编程风格以及他所习惯的另外一些技术。  </font>
		</p>
		<p>
				<font face="Verdana">别误会！我绝无贬低这位合作伙伴的意思。事实上，我对那些真正有着深厚的C编程功力的程序员常常怀有钦佩之心。毕竟，C++能有今天的成功在很大程度上缘于它深深地植根于C。作为一名C++程序员，倘若不熟悉C++中的C，我往往会认为他的基本功是不扎实的，他的技术底气是不足的。  </font>
		</p>
		<p>
				<font face="Verdana">不过话又说回来，C++是一种多范型（paradigm）编程语言，具体采用哪种编程风格，专业程序员应该知道视具体情况而定。作为一名经常需要在现场做即兴开发的项目负责人，为了短平快地解决当务之急，我习惯尽量采用现有的库（和组件）。效率（以及强健性）久经验证的C++标准库已经摆在那儿了，何乐而不用呢？  </font>
		</p>
		<p>
				<font face="Verdana">Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference <br />《C++标准程序库：自修教程与参考手册》，华中科技大学出版社 </font>
		</p>
		<p>
				<font face="Verdana">这是一本百科全书式的C++标准库著作，是一本需要一再查阅的参考大全。它在完备性、细致性以及精确性方面都是无与伦比的。本书详细介绍了每一标准库组件的规格和用法，内容涵盖包括流和本地化在内的整个标准库而不仅仅是STL。正如本书副标题所示，它首先适合作为教程阅读，尔后又可用作参考手册。 </font>
		</p>
		<p>
				<font face="Verdana">浅显易懂的写作风格使得这本书非常易读。如果你希望学习标准库的用法并尽可能地发挥其潜能，那你必须拥有这本书。正如网络上所言，这本书不仅仅应该摆在你的书橱中，更应该放到你的电脑桌上。我向每一位职业C++程序员强烈推荐。 </font>
		</p>
		<p>
				<font face="Verdana">Angelika Langer, Klaus Kreft, Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference <br />《标准C++输入输出流与本地化》，人民邮电出版社 </font>
		</p>
		<p>
				<font face="Verdana">C++标准库由STL、流和本地化三部分构成。关于STL的书市面上已经有不少，但罕见流和本地化方面的专著。本书是这两个领域中最优秀的一本，迄今为止没有任何一本书比这一本更全面详尽地讨论了流和本地化。如果你不满足于停留在“会用”流库的层面，千万不要错过它。 </font>
		</p>
		<p>
				<font face="Verdana">2001年夏天，我草草翻阅过这本书的中文版，从内容到包装都给我留下了比较深刻的印象 — 不过负面的居多一些。2003年秋天，无意中得知某网络书店正以超低价格甩卖这本书的中译本，情不自禁，一阵唏嘘。 </font>
		</p>
		<p>
				<font face="Verdana">Scott Meyers, Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library <br />《Effective STL（影印版）》，中国电力出版社 </font>
		</p>
		<p>
				<font face="Verdana">读完Scott 的《Effective C++》和《More Effective C++》的中译本之后，我一直期待这本书的中文版。我从潘爱民先生的个人主页上了解到，他和他的合作伙伴似乎早已完成了这本书的翻译工作，可惜至今市面上仍不得见。幸运的是，我们可以看到它的原版。 </font>
		</p>
		<p>
				<font face="Verdana">本书是使用STL的程序员必读之作。在这本书中，Scott向我们讲述STL容器和算法的工作机制以及如何以最佳方式使用它们。和Scott的其他作品一样，这本书的写作风格清晰、精确，具有极佳的可读性。看过这本书以后，我想你也许会和我以及其他C++程序员一样产生这样的想法：Scott什么时候会写出一本“More Effective STL”？ </font>
		</p>
		<p>
				<font face="Verdana">关于STL，我还提醒你留心Matthew H. Austern的《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》（《泛型编程与STL》，中国电力出版社）。这本书散发着浓厚的学院气息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一书末尾郑重推荐另外两本进阶好书（除了他们自己的《Ruminations on C++》外），其中一本是TCPL，另外一本就是本书！ </font>
		</p>
		<p>
				<font face="Verdana">网络编程 </font>
		</p>
		<p>
				<font face="Verdana">在网络编程时代，C++应该扮演着怎样的角色，让ACE（Adaptive Communications Environment）来告诉你。 </font>
		</p>
		<p>
				<font face="Verdana">Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns <br />Douglas C. Schmidt, Stephen D. Huston, C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks <br />《C++网络编程，卷1：运用ACE和模式消除复杂性》，华中科技大学出版社 <br />《C++网络编程，卷2：基于 ACE 和框架的系统化复用》，电子工业出版社 </font>
		</p>
		<p>
				<font face="Verdana">采用C++进行企业级网络编程，目前ACE（以及这两本书）是一个值得考虑的选择。ACE是一个面向对象、跨平台、开放源码的网络编程框架，目标在于构建高性能网络应用和中间件。Douglas是ACE的创始人，Stephen则已为ACE提供了数年的技术支持和顾问服务，两位都是ACE社群（是的，ACE的影响和实际应用的程度已经形成了一个社群）的专家。 </font>
		</p>
		<p>
				<font face="Verdana">ACE并不单单被大学和研究所追捧，它已经被成功地应用于世界上成千上万个商业应用中。在电信、宇航、医药和财经领域的网络系统中，ACE已经并继续发挥着重要的作用。如果你准备开发高性能通讯系统，你应该考虑考虑这一汇集世界顶尖专家智慧的成果。 </font>
		</p>
		<p>
				<font face="Verdana">除了使用C++面向对象设计技术和模板等高级语言特性外，ACE还运用了大量的模式。《C++网络编程》卷1和卷2并不仅仅教你关于ACE的方方面面，它还会教给你模式和通用框架设计等高级技术等。所以，作为一名中、高级C++程序员，即使你很少进行正儿八经的C++网络程序设计，阅读这两本书同样可以从中受益。 </font>
		</p>
		<p>
				<font face="Verdana">是的，并非所有网络应用都要使用Web服务器（以及其他应用服务器）和重量级组件模型，换个思路，它们或许也可以从轻量级的ACE组件中获益。 </font>
		</p>
		<p>
				<font face="Verdana">杂项 </font>
		</p>
		<p>
				<font face="Verdana">以下这几本书之所以被列入“杂项”单元，只是因为我没有考虑出更合适的归类方法，它们和上面的书籍一样，值得一读。 </font>
		</p>
		<p>
				<font face="Verdana">Bruce Eckel, Thinking in C++, Volume 1: Introduction to Standard C++ (2nd Edition) <br />Bruce Eckel, Thinking in C++, Volume 2: Practical Programming (Second Edition) <br />《C++编程思想（第2版）第1卷：标准C++导引》，机械工业出版社 <br />《C++编程思想（英文版 第2版）》，机械工业出版社 </font>
		</p>
		<p>
				<font face="Verdana">《Thinking in C++》的第1版于1996年荣获“软件研发”杂志评选的图书震撼大奖。最新推出的第2版对内容进行了大幅改写和调整，以反映C++标准化带来的影响以及近几年面向对象领域最新研究和实践成果。“输入输入流”、“多重继承”、“异常处理”和“运行时类型识别”等高级主题连同C++标准化以后增加的一些内容则被放入第二卷中。Bruce是一名经验丰富的C++讲师和顾问，其培训和写作经验都是世界一流水准，他的作品比那些“玩票”的技术人员写的东西更能吸引读者。事实上，在同类图书中，对于大多数读者而言，这本书的可读性要超过TCPL和《C++ Primer》。顺带一提，访问作者的站点，你可以先睹第二卷的风采。 </font>
		</p>
		<p>
				<font face="Verdana">Andrew Koenig, Barbara E. Moo, Ruminations on C++: A Decade of Programming Insight and Experience <br />《C++沉思录》，人民邮电出版社 </font>
		</p>
		<p>
				<font face="Verdana">Andrew是世界上屈指可数的C++专家。这是一本关于C++编程思想和程序设计技术而非语言细节的著作。如果你已经具有一定的基础，这本书将教你在进行C++编程时应该怎样思考，应该如何表达解决方案。整本书技术表达透彻，文字通俗易懂。Bjarne这样评价这本书：本书遍布“C++是什么、C++能够做什么”的真知灼见。 </font>
		</p>
		<p>
				<font face="Verdana">Stanley B. Lippman, Inside The C++ Object Model <br />《深度探索C++对象模型》，华中科技大学出版社 <br />《深度探索C++对象模型（影印版）》，中国电力出版社 </font>
		</p>
		<p>
				<font face="Verdana">从编译器的角度观察C++可以使你知其然并知其所以然。本书探讨了大量的C++面向对象程序设计的底层运作机制，包括构造函数、函数、临时对象、继承、虚拟、模板的实例化、异常处理、运行期类型识别等，另外还介绍了一些在实现C++对象模型过程中做出的权衡折衷。喜欢刨根问底的C++程序员不要错过这本书。 </font>
		</p>
		<p>
				<font face="Verdana">Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented software <br />《设计模式：可复用面向对象软件的基础》，机械工业出版社 <br />《设计模式：可复用面向对象软件的基础（英文版）》，机械工业出版社 </font>
		</p>
		<p>
				<font face="Verdana">设计可复用的面向对象的软件，你需要掌握设计模式。本书并非专为C++程序员而写，但它采用了C++（以及Smalltalk）作为主要示例语言，C++程序员尤其易于从中受益。四位作者都是国际公认的面向对象软件领域专家，他们将面向对象软件的设计经验作为设计模式详细记录下来。这本书影响是如此深远，以至于四位作者以及本书都被昵称为GoF（Gang of Four）。本书学院气息浓厚，行文风格严谨简洁，虽然它不如某些讲解模式的书籍易读，但真正要精准地理解设计模式，本书是终极权威。学习设计模式，这本书需要一而再、再而三的咀嚼。顺带一句：请将设计模式化作开拓思维的钥匙，切莫成为封闭思维的枷锁。 </font>
		</p>
		<p>
				<font face="Verdana">还有一些C++好书值得一读，恕此处无法一一列出。例如John Lakos的著作《Large-Scale C++ Software Design》（《大规模C++程序设计》，中国电力出版社）和侯捷先生的《STL 源码剖析》（华中科技大学出版社）等。 </font>
		</p>
		<p>
				<font face="Verdana">《STL 源码剖析》是一本很有特色的书，但我认为它还可以更好。我个人期待侯捷先生自第一版发行以来经过对模板技术的沉淀和再思考之后，再写一本剖析得更深入、更透彻并且更全面的“第二版”。遗憾的是，侯捷先生在完成《C++ Templates: The Complete Guide》一书的翻译后似乎决定暂时告别模板、泛型编程和STL领域。 </font>
		</p>
		<p>
				<font face="Verdana">2004年3月31日补充：我目前最常查阅的两本参考书是《C++标准程序库》和《STL源码剖析》。当然了，这与我年内的写作计划有很大的关系。 </font>
		</p>
		<p>
				<font face="Verdana">使用C++成功开发大规模软件系统，不仅需要很好地理解大多数C++书籍中讲述的逻辑设计问题，更需要掌握《大规模C++程序设计》中讲述的物理设计技术。当然，这本书的确有点过时了，不过，如果你的精力和金钱都比较宽绰，买一本看看并无坏处。 </font>
		</p>
		<p>
				<font face="Verdana">至此，我想有必要声明一下，有一些（好）书没有得到推荐，主要原因如下： </font>
		</p>
		<p>
				<font face="Verdana">    * 以上这些书已经足够多、足够好了。 <br />    * 我不会推荐通过正常渠道很难购买到的书籍 — 不管是中文版还是英文版。 <br />    * 作（译）者名气大小不影响我的推荐。我们是在看书，不是看人。 <br />    * 我不会推荐我从来没有看过的书。我至少要看过其中的某个版本（包括电子档）。这个“看”，一般指“认真阅读”，不过有一些也只能算是“浏览”。 </font>
		</p>
		<p>
				<font face="Verdana">结语 </font>
		</p>
		<p>
				<font face="Verdana">作为一名普通技术写译者，我深知技术创作和翻译的艰辛（和快乐），并多多少少了解一些有关技术书籍创作、翻译、制作、出版以及市场推介背后的细节。今天，我不会再对一本看上去差强人意的图书信口开河。罗列同一本书的各种版本的用意只在于为你多提供一些信息，让你多一种选择。 </font>
		</p>
		<p>
				<font face="Verdana">在本文成文的后期，我给Bjarne写了一封信，请教如果他来写这篇文章会怎么写。他给了我简明扼要的建议。在肯定以上列出的绝大部分图书都是世界顶尖水平的C++著作的同时，Bjarne提醒我别忘了向专家级程序员推荐《The C++ Standard : Incorporating Technical Corrigendum No. 1》。这本书是 C++标准规范的“图书版”，Bjarne亲自为之作序。 </font>
		</p>
		<p>
				<font face="Verdana">Bjarne还友好地提醒我，在我的推荐列表中没有哪一本有助于C++程序员进行Windows编程 — 这正是我的本意。在这篇文章中，我只推荐、点评平台中立的C++著作（网络编程除外） — 和操作系统无关，和集成开发环境无关，我甚至幻想它们和编译器也无关。你可以根据业务开发需要，选读自己喜爱的领域相关的C++书籍。 </font>
		</p>
		<p>
				<font face="Verdana">说到“系统无关、平台中立”，我不由得想起了“抽象层”的概念。开发实际应用的C++程序员通常工作于特定操作系统、特定开发环境和特定业务领域之中，而对标准C++和C++标准库扎实而深刻的把握，无疑是你得以在不同的操作系统、不同的开发环境以及不同的业务领域之间纵横驰骋的“抽象”本钱。  <br /></font>
		</p>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/7936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-05-31 13:36 <a href="http://www.cppblog.com/bloodsuck/archive/2006/05/31/7936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++书籍上（转载）</title><link>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7934.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 31 May 2006 05:35:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7934.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/7934.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/7934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/7934.html</trackback:ping><description><![CDATA[
		<font face="Verdana">C++是一门广泛用于工业软件研发的大型语言。它自身的复杂性和解决现实问题的能力，使其极具学术研究价值和工业价值。和C语言一样，C++已经在许多重要的领域大获成功。 </font>
		<p>
				<font face="Verdana">然而，一个不可否认的现实是，在低阶程序设计领域，C++挤压着C同时也在承受着C的强烈反弹，而在高阶程序设计领域，Java和C#正在不断蚕食着C++的地盘。也许C++与C合为一体永远都是一个梦想，也许Java和C#的狂潮终将迫使C++回归本位 — 回到它有着根本性优势的开发领域：低级系统程序设计、高级大规模高性能应用设计、嵌入式程序设计以及数值科学计算等。果真如此，我认为这未尝不是一件好事。 </font>
		</p>
		<p>
				<font face="Verdana">C++吸引如此之多的智力投入，以至于这个领域的优秀作品，包括重量级的软件产品、程序库以及书籍等，数不胜数。文题“C++程序设计之四书五经”一个不太严格的含义是：C++程序设计之四书 ⅹ 五经。是的，在本文（及其下篇）中，我将分门别类推荐20多本C++好书，你可以根据自己的需要选读。 </font>
		</p>
		<p>
				<font face="Verdana">TCPL和D&amp;E </font>
		</p>
		<p>
				<font face="Verdana">TCPL和D&amp;E分别是《The C++ Programming Language》和《The Design and Evolution of C++》的简称，均出自Bjarne Stroustrup之手。我将它们单列出来，首先是因为Bjarne是C++语言的创建者，然后是因为比“首先”那个原因更重要的原因：这两本书是C++领域毋庸置疑的杰作。说它们是C++语言圣经，并不为过。 </font>
		</p>
		<p>
				<font face="Verdana">Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition) <br />《C++程序设计语言（特别版）》，机械工业出版社 <br />《C++程序设计语言（特别版）（英文影印版）》，高等教育出版社 </font>
		</p>
		<p>
				<font face="Verdana">迄今为止，TCPL是除了C++标准文献之外最权威的C++参考手册。和大多数人的看法不大一样，我认为Bjarne的文字语言并不逊色于他所创建的程序语言，至少我喜欢这种学院气息浓厚的作品。本书对C++语言的描述轮廓鲜明、直截了当。它从C++语言创建者的角度来观察C++，这是任何别的作者和书籍做不到的 — 没有任何人比Bjarne自己更清楚该怎么来使用C++。 </font>
		</p>
		<p>
				<font face="Verdana">这是一本严肃的著作，以中、高级C++开发人员为目标读者。如果你是一名有经验的C++程序员，需要了解更加本质的C++知识，本书正是为你而写。它不是那种让你看了会不断窃喜的小书，需要用心体会，反复咀嚼。在阅读过程中，请特别留心Bjarne先生强调了什么，又对什么一语带过。我个人比较喜欢这本书的第四部分“使用C++做设计”，这样的内容在类似的程序设计语言书籍中很难看到 — 我甚至认为Bjarne应该将这部分独立出来单独写一本书。 </font>
		</p>
		<p>
				<font face="Verdana">Bjarne Stroustrup, The Design and Evolution of C++ <br />《C++语言的设计和演化》，机械工业出版社 <br />《C++语言的设计和演化（英文版）》，机械工业出版社 </font>
		</p>
		<p>
				<font face="Verdana">D&amp;E是一本关于C++语言设计原理、设计决策和设计哲学的专著。它清晰地回答了C++为什么会成为今天这个样子而没有变成另外一种语言。作为C++语言的创建者，Bjarne淋漓尽致地展示了他独到而深刻的见解。除了广受赞誉的语言特性外，Bjarne没有回避那些引起争议的甚至被拒绝的C++特性，他一一给出了逻辑严密、令人信服的解释。内容涵盖C++的史前时代、带类的C、C++的设计规则、标准化、库、内存管理、多重继承、模板等，对包括异常机制、运行时类型信息和名字空间在内的重要的新特性都分别进行了深入探讨。每一名C++程序员都应该可以从Bjarne的阐释中加深对手中这门语言的认识。 </font>
		</p>
		<p>
				<font face="Verdana">需要再次提醒的是，这两本书知识浓缩，信息量极大，请不要错过Bjarne每一句看似漫不经意的话。 </font>
		</p>
		<p>
				<font face="Verdana">入门教程 </font>
		</p>
		<p>
				<font face="Verdana">学习任何一门语言都需要一个从入门到精通、从新手到高手循序渐进的过程。不过，对于一个所谓的新手而言，究竟是一个完完全全的新手，还是一个熟悉某种别的语言的“新手”，甚至是在某种语言程序设计领域已经颇有建树的高手，很难一概而论？不同的C++新手需要不同的入门书籍。 </font>
		</p>
		<p>
				<font face="Verdana">Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example <br />《Accelerated C++中文版》，中国电力出版社 </font>
		</p>
		<p>
				<font face="Verdana">和市面上大多数C++教程不同，本书不是从“C++中的C”开始讲解，而是始于地道的C++特性。从一开始就使用标准库来写程序，随着讲述的逐渐深入，又一一解释这些标准库组件所依赖的基础概念。另外，和其他C++教材不同的是，这本书以实例拉动语言和标准库的讲解，对后两者的讲解是为了给实例程序提供支持，而不是像绝大多数C++教材那样，例子只是用作演示语言特性和标准库用法的辅助工具。 </font>
		</p>
		<p>
				<font face="Verdana">作者在C++领域的编程实践、教育培训以及技术写作方面都是世界一流水准。我喜欢这种大量使用标准库和C++语言原生特性的清新的写作风格。在这本教材面前，几乎迄今为止的所有C++教材都黯然失色或显得过时。尽管这本教材也许对于国内的高校教育来说有些前卫，不过我仍然极力向我的同行们推荐。顺带一提，在Bjarne和我最近的一封通信里，他这样评价本书：对于有经验的程序员学习C++而言，这本书可能是世界上最好的一本。 </font>
		</p>
		<p>
				<font face="Verdana">Stanley B.Lippman, Josee Lajoie, C++ Primer (3rd Edition) <br />《C++ Primer (3RD)中文版》，中国电力出版社 </font>
		</p>
		<p>
				<font face="Verdana">这本书的名字多少有点让人误解。尽管作者声称这本书是为C++新手而写，但无论是它的厚度还是讲解的深度都暴露了似乎并非如此。也许说它是一本“从入门到精通”的C++教程会更合适一些。我个人认为它并不适合完全不懂C++的初学者 — 在阅读这本书之前，你至少应该先有那么一点C或C++的背景知识，或者至少要具有一些其他语言的编程经验。 </font>
		</p>
		<p>
				<font face="Verdana">尽管这本书省略了一些高级C++特性的讨论，但仍然可以称得上是迄今为止最全面的C++学习教程。事实上，如果一名C++初学者能够扎扎实实地读完本书并对照《C++ Primer Answer Book》完成全部习题的话，他的水平肯定可以进入职业C++程序员的行列。我个人认为，即使你已经拥有了TCPL，这本书依然有拥有的价值，因为在许多方面它比TCPL来得更详细、更易懂。 </font>
		</p>
		<p>
				<font face="Verdana">Stanley B. Lippman, Essential C++ <br />《Essential C++中文版》，华中科技大学出版社 <br />《Essential C++（影印版）》，中国电力出版社 </font>
		</p>
		<p>
				<font face="Verdana">可以不太严格地认为这本书是《C++ Primer》的精简版。本书一一讲述了C++中最具代表性的主题，包括过程式编程、泛型编程、基于对象编程、面向对象编程、模板编程以及异常处理等。Stanley将门槛调低到“具有其他语言程序设计经验”的C++新手所能接受的最基本的层次，使他们能够迅速开始使用C++编程而又免于阅读《C++ Primer》那样的大部头。它以实例引导学习，力图使读者在最短的时间内把握C++的精粹。 </font>
		</p>
		<p>
				<font face="Verdana">也许换一个人来概述C++编程范型（paradigm）的方方面面需要好几百页才能说清楚，但这本小书不可思议地做到了这一点。我个人非常喜欢这种满是技术、简明扼要并且“有话好好说”的书。这本书同样具有一个明显的风格：所有程序例子全部采用标准库组件，让人耳目一新。 </font>
		</p>
		<p>
				<font face="Verdana">以上三本书都不是为了完完全全的编程新手而写。完全的C++编程新手可以阅读Francis Glassborow的新书（尚未出版）：《A Beginners Introduction to Computer Programming : You Can Do It!》。这也是Bjarne的推荐。Francis Glassborow是ACCU主席，多年来他对几乎每一本C++经典名著评头论足，他自己的这一本自然会引起C++社群的极大兴趣。 </font>
		</p>
		<p>
				<font face="Verdana">高效、健壮编程 </font>
		</p>
		<p>
				<font face="Verdana">两年前我在负责一个省级电力调度系统项目时编写了一个网关程序，它从SCADA系统获取电力实时信息。通讯接口采用了不常用的数据库直连方式（这个网关程序一端连接SQL Server 6.5，另一端连接Oralce 8.1.6）。由于实时测点近万，每次将全部取样更新或插入一遍显然是低效的。我在网关程序里建了一个内存库，获取到的数据首先在其中进行比较，然后决定是否更新物理数据库（同时还做了别的更复杂的事情……），从而在效率和资源占用两方面达到了预期效果。 </font>
		</p>
		<p>
				<font face="Verdana">这个程序一直运行得很好，但在离开现场之后的某一天，系统管理员打来电话，说大概因为网络故障等原因，有时这个网关程序会崩溃掉 — 它自己崩掉也就罢了，问题是它还会把Windows 2000 Advanced Server搞成“蓝屏”！坦白地说，我还从来没看过哪个非蓄意的程序有这个“能耐”。由于当时正忙于另外一个大项目，无法去现场调试，最后只有凭经验对内存库代码小心翼翼地封装以异常处理代码（同时也做了一些别的修改……）。这样，虽然没有彻底解决问题，但程序终究不再死得那么难看了。 </font>
		</p>
		<p>
				<font face="Verdana">在这儿讲这么一段花絮有什么意思呢（当初为那个可怕的bug朝思暮想时我可不认为这是一个“花絮”）？我想说的是，对于任何软件而言，离开强健，效率也就无从谈起。而对于C++程序员来说，也许编写一个高效的程序并不难，但要编写一个需要7 ⅹ 24小时持续运行的服务端软件就不是那么容易了，需要考虑许多因素，有时这些因素甚至远远超出C++语言和开发工具的本身。作为一名开发实际项目软件的程序员，并非非得自己碰钉子才能积累经验，只要我们足够虚心，别人的经验往往都是我们很好的借鉴。鉴于此，我推荐以下几本书供你选读，它们可以让你从强健和效率两方面受益（当然了，它们涵盖的内容远不限于异常处理J）。 </font>
		</p>
		<p>
				<font face="Verdana">Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition) <br />Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs <br />《Effective C++中文版》，华中科技大学出版社 <br />《More Effective C++中文版》，中国电力出版社 <br />《Effective C++（影印版）》，中国电力出版社 </font>
		</p>
		<p>
				<font face="Verdana">如果说《Effective C++》主要讨论C++中一些相对基础的概念和技巧的话，那么《More Effective C++》则着重探讨了包括异常处理在内的一系列高级技术。与前者相比，后者具有两大主要区别：其一，它包含很多时新的标准C++的内容；第二，它讨论的主题倾向于“战略化”而非“战术化”，并且讨论得更深入、更彻底。尤其是对虚析构函数、智能指针、引用计数以及代理类（proxy classe）等技术和模式论述的深入程度，让人很难想象是出现于这样的一本小书之中。 </font>
		</p>
		<p>
				<font face="Verdana">游刃有余的技术，高超的写作技巧，Scott无疑是世界上最优秀的C++技术作家之一。在简洁、清晰、易读等方面，这两本书都卓尔不群。总之，Scott提供的这85个可以改善编程技术和设计思维的方法，都是中、高级C++程序员必备的技能。我强烈推荐这两本书（实际上还有一本，稍后就会看到）。 </font>
		</p>
		<p>
				<font face="Verdana">Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions <br />Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions <br />《Exceptional C++中文版》，中国电力出版社 <br />《More Exceptional C++中文版》，华中科技大学出版社 </font>
		</p>
		<p>
				<font face="Verdana">你自认为是一名C++语言专家吗？读一读ISO C++标准委员会秘书长的这两本书再回答。在这两本书中，Herb采用了“问答”的方式指导你学习C++语言特性。对于每一个专题，Herb首先合理地设想出你的疑问和困惑，接着又猜测出你十有八九是错误的解答，然后给你以指点并提出最佳解决方案，最后还归纳出解决类似问题的普适性原则。 </font>
		</p>
		<p>
				<font face="Verdana">这两本书是典型的深究C++语言细节的著作，很薄，但内容密集，远远超过Scott的那两本书，读起来很费脑筋 — 我个人认为它们要比Scott的书难懂得多。若要研习这薄薄的两本书所包含的知识，至少需要花费数月的时间！（在Scott的荐序中，他坦陈不止一次陷入GotW问题的陷阱，你应该知道这意味着什么）对于语言细节的深究有什么好处呢？尽管在大多数情况下，我们不必关心C++代码幕后的动作，然而当我们不得不关心时，这两本书可以为我们提供很好的线索，因为它们揭示了C++语言中微妙而又至关重要的东西。 </font>
		</p>
		<p>
				<font face="Verdana">Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design <br />《C++程序设计陷阱》，中国青年出版社 </font>
		</p>
		<p>
				<font face="Verdana">Stephen的理论素养和实践经验注定这是一本值得一读的好书。Stephen曾经是贝尔实验室中第一批C++使用者。他已经使用C++成功解决了包括编译器、证券交易、电子商务以及嵌入式系统等领域中的问题。本书汇集了作者来自开发一线的99条编程真知灼见，洞悉它们，你可以避免几乎所有常见的C++设计和编程问题。 </font>
		</p>
		<p>
				<font face="Verdana">我甚至认为，对于C++编程菜鸟而言，阅读这本书会比阅读Scott和Herb的书更能轻松而立竿见影地获得更大的提高。我个人很喜欢这本书的写作风格 — Stephen的许多观点看似极端却无可辩驳。当然了，这种自信（以及冷幽默）来自于作者深厚的技术素养，而非自大的偏执。 </font>
		</p>
		<p>
				<font face="Verdana">除了上面推荐的书籍外，Dov Bulka和 David Mayhew合著的《Efficient C++: Performance Programming Techniques》（《提高C++性能的编程技术》，清华大学出版社）也值得一看。这本超薄小书聚焦于高性能C++应用程序开发。两位作者都是IBM软件专家，都工作于对性能要求极高的系统构建领域，本书是他们的经验之谈。也有人不喜欢这本书，因为它花了不少的篇幅讲述和C++无关的东西，我却恰恰因为这一点而对这本书产生好感，正是这些东西让我开阔了眼界。 </font>
		</p>
		<p>
				<font face="Verdana">模板和泛型编程 </font>
		</p>
		<p>
				<font face="Verdana">模板和基于模板的泛型编程无疑是当今发展最活跃的C++程序设计技术。模板的第一个革命性的应用是STL，它将模板技术在泛型容器和算法领域的运用展现得淋漓尽致，而Boost、Loki等现代程序库则将模板技术的潜能不断发挥到极致。在模板和泛型编程领域，我推荐以下两本重量级著作： </font>
		</p>
		<p>
				<font face="Verdana">David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide <br />《C++ Templates全览（繁体版）》，台湾碁峰资讯股份有限公司 <br />《C++ Templates全览（简体版）》，人民邮电出版社 </font>
		</p>
		<p>
				<font face="Verdana">有一种老套的赞美一本书的手法，大致是“没有看过这本书，你就怎么怎么地”，这里面往往夸张的成分居多。不过，倘若说“没有看过《C++ Templates: The Complete Guide》，你就不可能精通C++模板编程”，那么这个论断对于世界上绝大多数C++程序员来说是成立的。 </font>
		</p>
		<p>
				<font face="Verdana">这本书填补了C++模板书籍领域由来已久的空白。此前，上有《Modern C++ Design》这样的专注于模板高级编程技术和泛型模式的著作，下有《The C++ Standard Library》这样的针对特定模板框架和组件的使用指南。然而，假如对模板机制缺乏深入的理解，你就很难“上下”自如。鉴于此，我向每一位渴望透彻理解C++模板技术的朋友推荐这本书。 </font>
		</p>
		<p>
				<font face="Verdana">这本书在内地、台湾各有一个译本，但出自不同的译者之手。当你看到这篇文章时，两个译本应该都已经上市，对于读者来说当然也就多了一种选择。侯捷先生个人网站上开放了繁体译本大部分章节，不妨先睹为快。 </font>
		</p>
		<p>
				<font face="Verdana">Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied <br />《C++设计新思维：泛型编程与设计模式之应用》，华中科技大学出版社 <br />《C++设计新思维（影印版）》，中国电力出版社 </font>
		</p>
		<p>
				<font face="Verdana">你自认为是C++模板编程高手吗？请看过这本书再回答J 这是一本出自天才之手令人敬畏的杰作。泛型模式，无限延伸你的视野，足以挑战任何一名C++程序员的思维极限。 </font>
		</p>
		<p>
				<font face="Verdana">这本书共分为两大部分，第一部分讨论了 Loki程序库采用的基础技术以及一些高级语言特性，包括基于策略的类设计、模板局部特化、编译期断言、Typelist以及小型对象分配技术等。第二部分则着重介绍了Loki中的重要组件和泛型模式技术，包括泛化仿函数（Generalization Functor）、单件（Singleton）、智能指针、对象工厂（Object Factory）、抽象工厂（Abstract Factory）、访问者（Visitor）以及多方法（Multimethods）等。每一种技术都让人大开眼界，叹为观止。 </font>
		</p>
		<p>
				<font face="Verdana">在C++的学习方面，过犹不及往往成了不求甚解的借口。然而，面向对象并非C++的全部，模板和泛型编程亦占半壁江山。对于“严肃”的C++程序员而言，及时跟进这项早经例证的成功技术，不失为明智之举。 </font>
		</p>
		<p>
				<font face="Verdana">结语 </font>
		</p>
		<p>
				<font face="Verdana">这些著作是如此大名鼎鼎，也许根本不缺我一个推荐。然而，纵然C++程序员队伍的发展壮大速度不像其他更时髦的语言那样迅速，新人进总是多于旧人出。除了热忱地欢迎新人，我个人认为到了对C++书籍进行“盘点”的时候了，并且希望这样的“盘点”有益于感兴趣的读者。请保持耐心和宽厚。在下篇中，我将继续介绍标准库、网络编程以及其他方面的C++好书。有好书相伴，这个冬天不会冷</font>
		</p>
		<p>
				<font face="Verdana">
				</font> </p>
		<p>
				<font face="Verdana">
				</font> </p>
		<p> </p>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/7934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-05-31 13:35 <a href="http://www.cppblog.com/bloodsuck/archive/2006/05/31/7934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ STL简介(转载)</title><link>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7918.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Wed, 31 May 2006 02:01:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7918.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/7918.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/05/31/7918.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/7918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/7918.html</trackback:ping><description><![CDATA[
		<table height="100%" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td valign="top" width="100%">
										<table height="100%" cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td class="artitle" valign="top" colspan="2">C++ STL简介</td>
														</tr>
														<tr class="text" valign="top">
																<td align="left">原创：<a href="http://www.frontfree.net/user/view.htm?username=怒火之袍">怒火之袍</a></td>
																<td class="text" valign="top" align="right">2002年10月28日 </td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td class="arcontent" colspan="3">
										<br />
										<h3 align="left">一、STL简介</h3>
										<p align="left">STL（Standard Template Library，标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中，但在被引入C++之前该技术就已经存在了很长的一段时间。</p>
										<p align="left">STL的代码从广义上讲分为三类：algorithm（算法）、container（容器）和iterator（迭代器），几乎所有的代码都采用了模板类和模版函数的方式，这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中，STL被组织为下面的13个头文件：&lt;algorithm&gt;、&lt;deque&gt;、&lt;functional&gt;、&lt;iterator&gt;、&lt;vector&gt;、&lt;list&gt;、&lt;map&gt;、&lt;memory&gt;、&lt;numeric&gt;、&lt;queue&gt;、&lt;set&gt;、&lt;stack&gt;和&lt;utility&gt;。以下笔者就简单介绍一下STL各个部分的主要特点。</p>
										<h3 align="left">二、算法</h3>
										<p align="left">大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说，一个求方根的函数，在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择，直到真正想使用模板或者说对模板进行特化的时候，STL就利用了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类，然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。</p>
										<p align="left">STL提供了大约100个实现算法的模版函数，比如算法for_each将为指定序列中的每一个元素调用指定的函数，stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来，只要我们熟悉了STL之后，许多代码可以被大大的化简，只需要通过调用一两个算法模板，就可以完成所需要的功能并大大地提升效率。</p>
										<p align="left">算法部分主要由头文件&lt;algorithm&gt;，&lt;numeric&gt;和&lt;functional&gt;组成。&lt;algorithm&gt;是所有STL头文件中最大的一个（尽管它很好理解），它是由一大堆模版函数组成的，可以认为每个函数在很大程度上都是独立的，其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。&lt;numeric&gt;体积很小，只包括几个在序列上面进行简单数学运算的模板函数，包括加法和乘法在序列上的一些操作。&lt;functional&gt;中则定义了一些模板类，用以声明函数对象。</p>
										<h3 align="left">三、容器</h3>
										<p align="left">在实际的开发过程中，数据结构本身的重要性不会逊于操作于数据结构的算法的重要性，当程序中存在着对时间要求很高的部分时，数据结构的选择就显得更加重要。</p>
										<p align="left">经典的数据结构数量有限，但是我们常常重复着一些为了实现向量、链表等结构而编写的代码，这些代码都十分相似，只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便，它允许我们重复利用已有的实现构造自己的特定类型下的数据结构，通过设置一些模版类，STL容器对最常用的数据结构提供了支持，这些模板的参数允许我们指定容器中元素的数据类型，可以将我们许多重复而乏味的工作简化。</p>
										<p align="left">容器部分主要由头文件&lt;vector&gt;,&lt;list&gt;,&lt;deque&gt;,&lt;set&gt;,&lt;map&gt;,&lt;stack&gt;和&lt;queue&gt;组成。对于常用的一些容器和容器适配器（可以看作由其它容器实现的容器），可以通过下表总结一下它们和相应头文件的对应关系。</p>
										<table class="code" style="BORDER-COLLAPSE: collapse" bordercolor="#000000" height="358" cellspacing="0" cellpadding="5" border="1">
												<tbody>
														<tr>
																<td align="middle" width="25%" bgcolor="#008000">
																		<b>
																				<font color="#ffffff">数据结构</font>
																		</b>
																</td>
																<td align="middle" width="59%" bgcolor="#008000">
																		<b>
																				<font color="#ffffff">描述</font>
																		</b>
																</td>
																<td align="middle" width="16%" bgcolor="#008000">
																		<b>
																				<font color="#ffffff">实现头文件</font>
																		</b>
																</td>
														</tr>
														<tr>
																<td align="middle" width="25%">向量(vector)</td>
																<td width="59%">连续存储的元素</td>
																<td align="middle" width="16%">&lt;vector&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%" bgcolor="#e0e0e0">列表(list)</td>
																<td width="59%" bgcolor="#e0e0e0">由节点组成的双向链表，每个结点包含着一个元素</td>
																<td align="middle" width="16%" bgcolor="#e0e0e0">&lt;list&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%" height="14">双队列(deque)</td>
																<td width="59%" height="14">连续存储的指向不同元素的指针所组成的数组</td>
																<td align="middle" width="16%" height="14">&lt;deque&gt;</td>
														</tr>
														<tr>
																<td align="middle" bgcolor="#e0e0e0" height="48">集合(set)</td>
																<td bgcolor="#e0e0e0" height="48">由节点组成的红黑树，每个节点都包含着一个元素，节点之间以某种作用于元素对的谓词排列，没有两个不同的元素能够拥有相同的次序</td>
																<td align="middle" bgcolor="#e0e0e0" height="48">&lt;set&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%">多重集合(multiset)</td>
																<td width="59%">允许存在两个次序相等的元素的集合</td>
																<td align="middle" width="16%">&lt;set&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%" bgcolor="#e0e0e0">栈(stack)</td>
																<td width="59%" bgcolor="#e0e0e0">后进先出的值的排列</td>
																<td align="middle" width="16%" bgcolor="#e0e0e0">&lt;stack&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%">队列(queue)</td>
																<td width="59%">先进先出的执的排列</td>
																<td align="middle" width="16%">&lt;queue&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%" bgcolor="#e0e0e0">优先队列(priority_queue)</td>
																<td width="59%" bgcolor="#e0e0e0">元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列</td>
																<td align="middle" width="16%" bgcolor="#e0e0e0">&lt;queue&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%">映射(map)</td>
																<td width="59%">由{键，值}对组成的集合，以某种作用于键对上的谓词排列</td>
																<td align="middle" width="16%">&lt;map&gt;</td>
														</tr>
														<tr>
																<td align="middle" width="25%" bgcolor="#e0e0e0">多重映射(multimap)</td>
																<td width="59%" bgcolor="#e0e0e0">允许键对有相等的次序的映射</td>
																<td align="middle" width="16%" bgcolor="#e0e0e0">&lt;map&gt;</td>
														</tr>
												</tbody>
										</table>
										<h3 align="left">四、迭代器</h3>
										<p align="left">下面要说的迭代器从作用上来说是最基本的部分，可是理解起来比前两者都要费力一些（至少笔者是这样）。软件设计有一个基本原则，所有的问题都可以通过引进一个间接层来简化，这种简化在STL中就是用迭代器来完成的。概括来说，迭代器在STL中用来将算法和容器联系起来，起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的，每一个容器都定义了其本身所专有的迭代器，用以存取容器中的元素。</p>
										<p align="left">迭代器部分主要由头文件&lt;utility&gt;,&lt;iterator&gt;和&lt;memory&gt;组成。&lt;utility&gt;是一个很小的头文件，它包括了贯穿使用在STL中的几个模板的声明，&lt;iterator&gt;中提供了迭代器使用的许多方法，而对于&lt;memory&gt;的描述则十分的困难，它以不同寻常的方式为容器中的元素分配存储空间，同时也为某些算法执行期间产生的临时对象提供机制,&lt;memory&gt;中的主要部分是模板类allocator，它负责产生所有容器中的默认分配器。</p>
										<h3 align="left">五、对初学者学习STL的一点建议</h3>
										<p align="left">对于之前不太了解STL的读者来说，上面的文字只是十分概括地描述了一下STL的框架，对您理解STL的机制乃至使用STL所起到的帮助微乎甚微，这不光是因为深入STL需要对C++的高级应用有比较全面的了解，更因为STL的三个部分算法、容器和迭代器三部分是互相牵制或者说是紧密结合的。从概念上讲最基础的部分是迭代器，可是直接学习迭代器会遇到许多抽象枯燥和繁琐的细节，然而不真正理解迭代器又是无法直接进入另两部分的学习的（至少对剖析源码来说是这样）。可以说，适应STL处理问题的方法是需要花费一定的时间的，但是以此为代价，STL取得了一种十分可贵的独立性，它通过迭代器能在尽可能少地知道某种数据结构的情况下完成对这一结构的运算，所以下决心钻研STL的朋友们千万不要被一时的困难击倒。其实STL运用的模式相对统一，只要适应了它，从一个STL工具到另一个工具，都不会有什么大的变化。</p>
										<p align="left">对于STL的使用，也普遍存在着两种观点。第一种认为STL的最大作用在于充当经典的数据结构和算法教材，因为它的源代码涉及了许多具体实现方面的问题。第二种则认为STL的初衷乃是为了简化设计，避免重复劳动，提高编程效率，因此应该是“应用至上”的，对于源代码则不必深究。笔者则认为分析源代码和应用并不矛盾，通过分析源代码也能提高我们对其应用的理解，当然根据具体的目的也可以有不同的侧重。</p>
										<p align="left">最后要说的是，STL是ANSI/ISO C++标准的一部分，所以对于一个可以有多种C++实现的过程，首先考虑的应该是STL提供的模板（高效且可移植性好），其次才是各个厂商各自相应的库（高效但可移植性不好）以及自己去编写代码（可移植性好但低效）。</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/7918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-05-31 10:01 <a href="http://www.cppblog.com/bloodsuck/archive/2006/05/31/7918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类模板（原创）</title><link>http://www.cppblog.com/bloodsuck/archive/2006/05/27/7730.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Sat, 27 May 2006 09:55:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/05/27/7730.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/7730.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/05/27/7730.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/7730.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/7730.html</trackback:ping><description><![CDATA[
		<pre>                             <font size="2"> 这几天看了下模板 ，以下是个人的些心得，高手见笑了<br />1.类模版 实例 对象定义 引起 实例化<br />                            指针，引用 不会引起实例化<br />类非型参数  只能是 整形，枚举，外联结，且应为一个常量编译时就应确定<br />                    浮点型，类类型，。。。都不可以<br />2.class templates 的成员函数 在调用和取地址时实例化，在类实例化时不会自动实例化<br />3.class templates 的友元申明<br />    a.非模版类型<br />          friend class man;<br />          friend void f(void);<br />           friend void man::f(void);<br />   b.一对一的模版友元<br />             friend class man&lt;T&gt;;<br />             friend void f&lt;T&gt;( man&lt;T&gt;);<br />             friend void man&lt;T&gt;::f();<br />    c.一对多的模版友元<br />          template &lt;typename T&gt;<br />               friend class man;<br />           template &lt;typename T&gt;<br />              friend void  f( T);<br />           template &lt;typename T&gt;<br />              friend void man&lt;T&gt;::f();<br />4.类模版的静态成员 <br />      并不在模版定义时实例化，在类模版实例化时实例化，对应1个类型<br />template &lt;typename T&gt;<br />int man&lt;T&gt;::size=10;<br />而成员函数应为<br />  template &lt;typename T&gt;<br />   void man&lt;T&gt;::f(void)<br />{<br />..........................................<br />}<br />5.成员模版 可以是普通类和 模版类<br />如：<br />class woman                                             <br />{<br />public:<br /> template &lt;typename T&gt;<br />  class man<br /> {<br /> public:<br />  print(T a)<br />  {<br />   cout&lt;&lt;a;<br />    <br />  }</font></pre>
		<p>
				<font size="2"> };<br /> template &lt;typename T2&gt;<br />  void print(T2 a)<br /> {<br />  cout&lt;&lt;a;<br /> };<br />protected:<br />private:<br />};<br />                         1个好的例子<br />                           template &lt;typename T&gt;   class A  <br />                                {      public:<br />                                                      template &lt;typename T1&gt;               <br />                                                      A&amp;    operator =(const A&lt;T1&gt; &amp; );<br />                               }<br />                               如此 则A 的对象 可以用其他型的对象赋值了<br />     在使用时才实例化<br />                                        但是其定义比较骇人<br />                         template &lt;typename T&gt; <br />                                     template&lt;typename T1&gt;<br />                                     A&lt;T&gt;&amp;  A&lt;T&gt;::operator=(const A&lt;T1&gt;&amp; a)<br />                                   {  ...........................}<br /><br /><br /><br />6.类模版的特化<br />      特化1个类模板（所有成员必须特化包括静态类数据成员(vc),但友元模板（1：1）可以<br />不特化，当作一个显示实参的函数模板处理即可） 或 特化1个模板 成员函数<br /><br />         模板成员函数特化是定义必须出现在实现文件（cpp)中<br />       语法为<br />    void man&lt;int&gt;::f(void)<br />{<br />............................<br />}<br />      <br />类特化<br /> template &lt;&gt;<br />class man&lt;int&gt;<br />{<br />       ......//中所有类型参数以int 替代<br />};<br />      <br />  man&lt;int&gt;::man()<br />{<br />......<br />}<br /><br />void man&lt;int&gt;::f(void)<br />{<br />}<br />注意  类成员中<br />   static const 有序类型可以在体内初始化static const int a=10;<br />                        仅仅static  必须在体外<br />                                                               static int a;<br />                                                              int woman::a=10;<br />   非 特化<br />   template &lt;typename T&gt;<br />   int man&lt;T&gt;::size=10;<br />   特化<br />   int man&lt;char&gt;::size=10;<br />7偏特化<br />   类模板有1个以上模版参数（类型参数，非类型参数）<br />              某些模版参数 被实际的型和值取代（注意是 取代 ，不是增加，减少）<br />      如：<br /><br />//////////////////头文件<br />       template &lt;typename T1,typename T2,int size&gt;<br />class wc<br />{<br />public:<br /> wc()<br /> {<br />  cout&lt;&lt;"\n int T1,T2, int";<br /> }<br />protected:<br />private:<br />};<br />template &lt;typename T,int size&gt;<br />class  wc&lt;T* ,T,size&gt;<br />{<br />public:<br /> wc()<br /> {<br />  cout&lt;&lt;"\n in T *, T ,size";<br /> }<br />protected:<br />private:<br />};<br />template &lt;typename T,int size&gt;<br />class  wc&lt;T* ,float,size&gt;<br />{<br />public:<br /> wc()<br /> {<br />  cout&lt;&lt;"\n in T* ,float,size";<br /> }<br />protected:<br />private:<br />};<br />template &lt;typename T&gt;<br />class  wc&lt;T* ,float,80&gt;<br />{<br />public:<br /> wc()<br /> {<br />  cout&lt;&lt;"\n in T* ,float,80";<br /> }<br />protected:<br />private:<br />};<br />///////头文件<br />//////main()<br />wc&lt;int,float,10&gt; wc1;<br /> wc&lt;int* ,int ,20&gt; wc2;<br /> wc&lt;int*,float,39&gt; wc3;<br />wc&lt;int*,float,80&gt;wc4;<br />///////main() ,在vc 7 上通过<br />//////main()<br /><br /><br />8.预设模板参数(只有在类模板中才指定 ，1 .  明确指定 a&lt;int,int&gt;   ,直接定义时 man&lt;&gt;  kkk;2. a&lt;T,T&gt; )<br />template &lt;typename T,typename T1=float&gt;<br />class man<br />{<br />..........<br />}<br /><br />写到这里突然想到<br />                  class A {<br />                            virtual void   print();<br />                              };<br />                  class B:public A {<br />                                          virtual void print();<br />                                          };<br />B b;<br />                 A *a =&amp;b;<br />                a-&gt;print();//调用 B的，此时 print()中的this 指针是 B * const,使用B 的接口 ;<br /><br />9.双重模板参数（很有用）<br />                template &lt;typename T,typename G =man&lt;T&gt; &gt;<br /> class baby<br /> {<br /> public:<br />  baby ()<br />  {<br />   cout&lt;&lt;"\n in baby";<br />  }<br /> protected:<br /> private:<br /> };//类型参数可以是 类类型<br />         <br />baby&lt;int, man&lt;float&gt; &gt; b;  //ok<br />////////////////////////<br />template &lt;typename T,template &lt;typename G&gt; class TT&gt;//可以省略为 template &lt;typename T  ,template&lt;typename&gt;  class  TT&gt;<br /> class  son<br /> {<br /> public:<br />   TT&lt;T&gt; * a; <br />     son()<br />  {<br />           a=0;<br />   cout&lt;&lt;"\n in son";<br />  }<br /> protected:<br /> private:<br /> };<br />   son&lt;int, man&gt; b;//则就含有了 man&lt;int &gt; * a;<br />TT 是模板占位符号，是一个带1个类型参数的类模板，如果其有默认模板参数 则忽略掉  <br />所以 GG若带默认 的模板 应该如下<br />            template &lt;typename T, template &lt;typename T2, typename= man&lt;T2&gt;  &gt; class GG&gt;<br />class son<br />{<br />}</font>
		</p>
		<p>
				<font size="2">/////////   类模板类型参数 同时还可以是 类模板<br /><br />10. 字符串常量在模板中的注意事项<br /><br />           char * a="hi ,friend ";///"hi, friend"  文字常量 是 const char [10] 类型  左值转换到 const char * <br />限定转换到 char *,<br />                template &lt;typename T〉<br />      ostream&amp; operator &lt;&lt;(ostream &amp; os, const T &amp; b)；//注意只有const 才能接受临时变量<br /><br />             cout&lt;&lt;"hi,friend";   <br />              cout&lt;&lt;"bad";<br />/////2个不同的模板实例<br />   typeid(变量).name();///直接打印出变量类型<br />写到这，闲扯下：<br />    栈区，堆区，全局（静态）区，文字常量，代码区，5个大区，这个是我听说的<br />////////////////////////////////////////////////<br />11.模板的编译模型<br />     在实例化点必须能找到定义//原则<br />                           只能使用包含模式了，<br />a..h. cpp 在 .h最后一行包含进 cpp<br />b. 全部在h 或 cpp<br /><br />                     分离模式,目前支持的export 关键字i的编译器很少（vc.net 不支持）</font>
				<br />
				<br />12.<br />函数指针类型也能做模板类型参数<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">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">bool</span>
				<span style="COLOR: #000000"> minn(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> a,</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> b)<br /><img id="Codehighlighter1_23_40_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_40_Open_Text.style.display='none'; Codehighlighter1_23_40_Closed_Image.style.display='inline'; Codehighlighter1_23_40_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_23_40_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_40_Closed_Text.style.display='none'; Codehighlighter1_23_40_Open_Image.style.display='inline'; Codehighlighter1_23_40_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_23_40_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_23_40_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> a</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">b;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> template </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">typename T1,typename T2</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> T1</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">  mymin(</span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> T1</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> t1, </span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> T1</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000"> t2, T2 t3 )<br /><img id="Codehighlighter1_137_166_Open_Image" onclick="this.style.display='none'; Codehighlighter1_137_166_Open_Text.style.display='none'; Codehighlighter1_137_166_Closed_Image.style.display='inline'; Codehighlighter1_137_166_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_137_166_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_137_166_Closed_Text.style.display='none'; Codehighlighter1_137_166_Open_Image.style.display='inline'; Codehighlighter1_137_166_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span>
				<span id="Codehighlighter1_137_166_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_137_166_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> t3(t1,t2)</span>
						<span style="COLOR: #000000">?</span>
						<span style="COLOR: #000000">t1:t2;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> main()<br /><img id="Codehighlighter1_180_205_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_205_Open_Text.style.display='none'; Codehighlighter1_180_205_Closed_Image.style.display='inline'; Codehighlighter1_180_205_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_180_205_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_180_205_Closed_Text.style.display='none'; Codehighlighter1_180_205_Open_Image.style.display='inline'; Codehighlighter1_180_205_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_180_205_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_180_205_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />cout</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">mymin(</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">3</span>
						<span style="COLOR: #000000">,minn);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />13.<br />模板参数可以是个类模板   <br />template &lt;typename T&gt; <br />class a<br />{<br />};<br />a&lt; vector &lt;int&gt; &gt;;<br /><br /><br />template &lt;typename T, typename T2,template &lt;typename T,typename T2&gt; class con  &gt;<br />void add(con&lt;T,T2&gt;,con&lt;T,T2&gt;)<br />{<br /> cout&lt;&lt;"ok";<br />}<br /><br />add(a,b)//特殊在于 需要推导,vc 7 可以从  类模板中推导出参数类型</p>
		<p>template &lt;typename T,template &lt;typename T2,typename T3&gt; class con &gt;<br />class ggoo<br />{<br />public:<br /> con&lt;T,T&gt; a;<br />con&lt;int,int&gt; b;<br /><br />protected:<br />private:<br />};<br /><br />ggoo&lt;int,double, b&gt; kk;//b&lt;int,double&gt;, con 的模板参数可以任意<br /> </p>
<img src ="http://www.cppblog.com/bloodsuck/aggbug/7730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-05-27 17:55 <a href="http://www.cppblog.com/bloodsuck/archive/2006/05/27/7730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数模板(原创）</title><link>http://www.cppblog.com/bloodsuck/archive/2006/05/27/7728.html</link><dc:creator>黄大仙</dc:creator><author>黄大仙</author><pubDate>Sat, 27 May 2006 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/bloodsuck/archive/2006/05/27/7728.html</guid><wfw:comment>http://www.cppblog.com/bloodsuck/comments/7728.html</wfw:comment><comments>http://www.cppblog.com/bloodsuck/archive/2006/05/27/7728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodsuck/comments/commentRss/7728.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodsuck/services/trackbacks/7728.html</trackback:ping><description><![CDATA[      template &lt;typename T&gt;<br /> T f(T a1,T a2)<br />{<br />.........................<br />}<br /><br /><br />显示实参<br />f&lt;int &gt;(1,2);<br />显示实例化<br />template  int f&lt;int &gt;(int ,int);（申明）<br />显示特化<br />  template &lt;&gt; int f&lt;int&gt; (int,int)（定义）<br />{<br /><br />      ...........<br />}<br />强制 从模版中挑选<br /> <br />f&lt;&gt;(2,3);<br /><br />在函数调用，取函数地址时 实参推演（左值，限定，基类）<br /> int (* p)(int ,int)=&amp;f;     int(*p) (int ,int )=&amp; f&lt;int,int&gt;<br />  f(2,3);                             f&lt;int,int&gt;(2,3);<br />1.编译模版时，编译器检查<br />2.实例化时（在实例化点 再编译），编译器检查<br /><br />函数模版 只能出现在模版定义中<br />函数模版实例 可以出现在模版定义和非定义中<br />//////////////////////<br />1.非模版函数优先级高<br />2.候选---〉可行实例化（有特化否〈）（有非模版否）--〉选中<br />3.依赖模版参数的在实例点解析，不依赖的在模版定义时解析<img src ="http://www.cppblog.com/bloodsuck/aggbug/7728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodsuck/" target="_blank">黄大仙</a> 2006-05-27 15:31 <a href="http://www.cppblog.com/bloodsuck/archive/2006/05/27/7728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>