﻿<?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/C++</title><link>http://www.cppblog.com/wolf/category/6280.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 28 Aug 2010 08:19:22 GMT</lastBuildDate><pubDate>Sat, 28 Aug 2010 08:19:22 GMT</pubDate><ttl>60</ttl><item><title>常见设计模式之抽象工厂模式</title><link>http://www.cppblog.com/wolf/articles/122611.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Tue, 24 Aug 2010 16:59:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/122611.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/122611.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/122611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/122611.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/122611.html</trackback:ping><description><![CDATA[之前介绍过简单工厂模式、工厂模式，这节介绍下工厂家族的最后一种设计模式--抽象工厂设计模式。
<div>实际上，如果对前两种模式熟练掌握的话，这个相对来说最复杂的设计模式也不难理解，它也可以理解为是在工厂模式基础上的升级。</div>
<div>我们知道，工厂模式将一个类的实例化延迟到子类，具体产品类由具体工厂类来实例化，但这种关系基本是一对一的，也就是说一个抽象工厂类对应一个抽象产品类，多个具体工厂类对应多个具体产品类。归纳来说就是一个工厂族只服务于一个产品族。</div>
<div>抽象工厂模式实现了工厂类与产品类一对多的关系，或者说工厂族与产品族实现了一对多的关系。它们的区别可以用一家工厂来形容，工厂模式就像是这家工厂的一条生产线，而抽象工厂模式就好比整个工厂的所有生产线。</div>
<div><br></div>
<img src ="http://www.cppblog.com/wolf/aggbug/122611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2010-08-25 00:59 <a href="http://www.cppblog.com/wolf/articles/122611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见设计模式之代理模式（Proxy）</title><link>http://www.cppblog.com/wolf/articles/124599.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Tue, 24 Aug 2010 16:37:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/124599.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/124599.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/124599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/124599.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/124599.html</trackback:ping><description><![CDATA[<p><strong>概念<br></strong>代理这个词对我们来说非常熟悉，比如上网经常使用的代理服务器，还有销售代理商等。就是客户与目标之间的桥梁。<br>设计模式中的代理模式（Proxy）是这样定义的：为其他对象提供一种代理以控制对这个对象的访问。<br>若要为其他对象提供代理服务，那么首先本身也要具有与被代理对象同样的方法，那么这样在访问时才能真正起到（透明）代理的作用。<br>所以代理类一般同被代理类是继承于同一个类的兄弟类，区别就是他是为别人服务的。<br><br>这样说来，表面看代理很风光，啥都得通过他，好像没他不行似的，其实他就是个跑堂的！</p>
<p><strong><br>组成部分</strong><br>1.抽象主题：基类，声明了代理对象和真实对象的共同点；<br>2.真实主题：真正需要被调用的对象；<br>3.代理对象：代理真实对象的对象。</p>
<p><br><strong>分类<br></strong>1.远程代理：也就是为一个对象在不同的地址空间提供局部代表，这样可以隐藏一个对象存在于不同地址空间的事实。这个不同的地址空间可以是在本机器上，也可以在另一台机器中。<br>2.虚拟代理：是根据需要创建开销很大的对象，通过它来存放实例化需要很长时间的真实对象，使其只有在真正需要时才被创建。<br>3.安全代理：也叫保护代理，用来控制真实对象访问时的权限，如果有必要的话，可以给不同调用者提供不同的权限。<br>4.智能指引：是指当调用真实对象时，代理处理另外一些事，比如记录对此对象的调用次数等。<br>5.写时拷贝：虚拟代理的一种，把复制推迟到只有客户的需要时才进行。<br>6.缓存代理：为某一个目标的操作结果提供临时存储空间，以便其他客户的可以共享访问，有点缓存的味道。<br>7.防火墙代理：保护对象，不让用户访问，安全代理的特例。<br>8.同步代理：可以让几个用户同时访问同一个对象而不产生冲突。<br>常用的是前四种代理方式。</p>
<p><strong>UML类图<br></strong>&nbsp;<img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wolf/Proxy.jpg" width=660 border=0><br><br><strong>实例代码<br></strong>1）Proxy.h<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">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#ifndef&nbsp;_PROXY_H<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></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;_PROXY_H</span><span style="COLOR: #000000"><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><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_35_65_Open_Image onclick="this.style.display='none'; Codehighlighter1_35_65_Open_Text.style.display='none'; Codehighlighter1_35_65_Closed_Image.style.display='inline'; Codehighlighter1_35_65_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_35_65_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_35_65_Closed_Text.style.display='none'; Codehighlighter1_35_65_Open_Image.style.display='inline'; Codehighlighter1_35_65_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_35_65_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_35_65_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">@brief&nbsp;Abstract&nbsp;Base&nbsp;Class.</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">&nbsp;5</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Subject&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_81_166_Open_Image onclick="this.style.display='none'; Codehighlighter1_81_166_Open_Text.style.display='none'; Codehighlighter1_81_166_Closed_Image.style.display='inline'; Codehighlighter1_81_166_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_81_166_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_81_166_Closed_Text.style.display='none'; Codehighlighter1_81_166_Open_Image.style.display='inline'; Codehighlighter1_81_166_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_81_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_81_166_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</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;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_105_106_Open_Image onclick="this.style.display='none'; Codehighlighter1_105_106_Open_Text.style.display='none'; Codehighlighter1_105_106_Closed_Image.style.display='inline'; Codehighlighter1_105_106_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_105_106_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_105_106_Closed_Text.style.display='none'; Codehighlighter1_105_106_Open_Image.style.display='inline'; Codehighlighter1_105_106_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Subject()&nbsp;</span><span id=Codehighlighter1_105_106_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_105_106_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_131_132_Open_Image onclick="this.style.display='none'; Codehighlighter1_131_132_Open_Text.style.display='none'; Codehighlighter1_131_132_Closed_Image.style.display='inline'; Codehighlighter1_131_132_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_131_132_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_131_132_Closed_Text.style.display='none'; Codehighlighter1_131_132_Open_Image.style.display='inline'; Codehighlighter1_131_132_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Subject()&nbsp;</span><span id=Codehighlighter1_131_132_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_131_132_Open_Text><span style="COLOR: #000000">{}</span></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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;request()&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">11</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">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 id=Codehighlighter1_170_198_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_198_Open_Text.style.display='none'; Codehighlighter1_170_198_Closed_Image.style.display='inline'; Codehighlighter1_170_198_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_170_198_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_198_Closed_Text.style.display='none'; Codehighlighter1_170_198_Open_Image.style.display='inline'; Codehighlighter1_170_198_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_170_198_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_170_198_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">@brief&nbsp;Real&nbsp;entity&nbsp;class.</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">14</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;RealSubject:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Subject&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id=Codehighlighter1_234_319_Open_Image onclick="this.style.display='none'; Codehighlighter1_234_319_Open_Text.style.display='none'; Codehighlighter1_234_319_Closed_Image.style.display='inline'; Codehighlighter1_234_319_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_234_319_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_234_319_Closed_Text.style.display='none'; Codehighlighter1_234_319_Open_Image.style.display='inline'; Codehighlighter1_234_319_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_234_319_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_234_319_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</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">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RealSubject();<br></span><span style="COLOR: #008080">18</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">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">RealSubject();<br></span><span style="COLOR: #008080">19</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">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;request();<br></span><span style="COLOR: #008080">20</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">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 id=Codehighlighter1_323_404_Open_Image onclick="this.style.display='none'; Codehighlighter1_323_404_Open_Text.style.display='none'; Codehighlighter1_323_404_Closed_Image.style.display='inline'; Codehighlighter1_323_404_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_323_404_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_323_404_Closed_Text.style.display='none'; Codehighlighter1_323_404_Open_Image.style.display='inline'; Codehighlighter1_323_404_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_323_404_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_323_404_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">@brief&nbsp;Proxy&nbsp;class,&nbsp;including&nbsp;a&nbsp;pointer&nbsp;of&nbsp;pointing&nbsp;to&nbsp;the&nbsp;Real-entity&nbsp;class.&nbsp;</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">23</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Proxy:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Subject&nbsp;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img id=Codehighlighter1_434_549_Open_Image onclick="this.style.display='none'; Codehighlighter1_434_549_Open_Text.style.display='none'; Codehighlighter1_434_549_Closed_Image.style.display='inline'; Codehighlighter1_434_549_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_434_549_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_434_549_Closed_Text.style.display='none'; Codehighlighter1_434_549_Open_Image.style.display='inline'; Codehighlighter1_434_549_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_434_549_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_434_549_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">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/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Proxy();<br></span><span style="COLOR: #008080">27</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">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Proxy();<br></span><span style="COLOR: #008080">28</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">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;request();<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/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RealSubject</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_realSubject;<br></span><span style="COLOR: #008080">32</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">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></span><span style="COLOR: #0000ff">#endif</span></div>
<br>2）Proxy.cpp<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: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Proxy.h</span><span style="COLOR: #000000">"</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>#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;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><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></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;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>RealSubject::RealSubject()<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_89_138_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_138_Open_Text.style.display='none'; Codehighlighter1_89_138_Closed_Image.style.display='inline'; Codehighlighter1_89_138_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_89_138_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_138_Closed_Text.style.display='none'; Codehighlighter1_89_138_Open_Image.style.display='inline'; Codehighlighter1_89_138_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_89_138_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_89_138_Open_Text><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/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">RealSubject&nbsp;constructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">&nbsp;9</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">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>RealSubject::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">RealSubject()<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_169_217_Open_Image onclick="this.style.display='none'; Codehighlighter1_169_217_Open_Text.style.display='none'; Codehighlighter1_169_217_Closed_Image.style.display='inline'; Codehighlighter1_169_217_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_169_217_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_169_217_Closed_Text.style.display='none'; Codehighlighter1_169_217_Open_Image.style.display='inline'; Codehighlighter1_169_217_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_169_217_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_169_217_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">RealSubject&nbsp;destructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">14</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">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 id=Codehighlighter1_220_259_Open_Image onclick="this.style.display='none'; Codehighlighter1_220_259_Open_Text.style.display='none'; Codehighlighter1_220_259_Closed_Image.style.display='inline'; Codehighlighter1_220_259_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_220_259_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_220_259_Closed_Text.style.display='none'; Codehighlighter1_220_259_Open_Image.style.display='inline'; Codehighlighter1_220_259_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_220_259_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_220_259_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">@brief&nbsp;Real-entity's&nbsp;request&nbsp;method.</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">17</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RealSubject::request()<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id=Codehighlighter1_288_333_Open_Image onclick="this.style.display='none'; Codehighlighter1_288_333_Open_Text.style.display='none'; Codehighlighter1_288_333_Closed_Image.style.display='inline'; Codehighlighter1_288_333_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_288_333_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_288_333_Closed_Text.style.display='none'; Codehighlighter1_288_333_Open_Image.style.display='inline'; Codehighlighter1_288_333_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_288_333_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_288_333_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">RealSubject&nbsp;request</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">20</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">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>Proxy::Proxy():&nbsp;m_realSubject(NULL)<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img id=Codehighlighter1_372_415_Open_Image onclick="this.style.display='none'; Codehighlighter1_372_415_Open_Text.style.display='none'; Codehighlighter1_372_415_Closed_Image.style.display='inline'; Codehighlighter1_372_415_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_372_415_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_372_415_Closed_Text.style.display='none'; Codehighlighter1_372_415_Open_Image.style.display='inline'; Codehighlighter1_372_415_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_372_415_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_372_415_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Proxy&nbsp;constructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">25</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">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>Proxy::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Proxy()<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img id=Codehighlighter1_434_528_Open_Image onclick="this.style.display='none'; Codehighlighter1_434_528_Open_Text.style.display='none'; Codehighlighter1_434_528_Closed_Image.style.display='inline'; Codehighlighter1_434_528_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_434_528_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_434_528_Closed_Text.style.display='none'; Codehighlighter1_434_528_Open_Image.style.display='inline'; Codehighlighter1_434_528_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_434_528_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_434_528_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Proxy&nbsp;destructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_realSubject;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_realSubject&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br></span><span style="COLOR: #008080">32</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">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 id=Codehighlighter1_531_564_Open_Image onclick="this.style.display='none'; Codehighlighter1_531_564_Open_Text.style.display='none'; Codehighlighter1_531_564_Closed_Image.style.display='inline'; Codehighlighter1_531_564_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_531_564_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_531_564_Closed_Text.style.display='none'; Codehighlighter1_531_564_Open_Image.style.display='inline'; Codehighlighter1_531_564_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_531_564_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_531_564_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">@brief&nbsp;Proxy's&nbsp;request&nbsp;method.</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">35</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Proxy::request()<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img id=Codehighlighter1_587_776_Open_Image onclick="this.style.display='none'; Codehighlighter1_587_776_Open_Text.style.display='none'; Codehighlighter1_587_776_Closed_Image.style.display='inline'; Codehighlighter1_587_776_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_587_776_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_587_776_Closed_Text.style.display='none'; Codehighlighter1_587_776_Open_Image.style.display='inline'; Codehighlighter1_587_776_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_587_776_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_587_776_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Proxy&nbsp;request</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img id=Codehighlighter1_631_669_Open_Image onclick="this.style.display='none'; Codehighlighter1_631_669_Open_Text.style.display='none'; Codehighlighter1_631_669_Closed_Image.style.display='inline'; Codehighlighter1_631_669_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_631_669_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_631_669_Closed_Text.style.display='none'; Codehighlighter1_631_669_Open_Image.style.display='inline'; Codehighlighter1_631_669_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_631_669_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_631_669_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">@brief&nbsp;Construct&nbsp;it&nbsp;when&nbsp;necessary.</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">40</span><img id=Codehighlighter1_694_743_Open_Image onclick="this.style.display='none'; Codehighlighter1_694_743_Open_Text.style.display='none'; Codehighlighter1_694_743_Closed_Image.style.display='inline'; Codehighlighter1_694_743_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_694_743_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_694_743_Closed_Text.style.display='none'; Codehighlighter1_694_743_Open_Image.style.display='inline'; Codehighlighter1_694_743_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_realSubject)&nbsp;</span><span id=Codehighlighter1_694_743_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_694_743_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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_realSubject&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;RealSubject();<br></span><span style="COLOR: #008080">42</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">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_realSubject</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">request();<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>3）Main.cpp<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: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Proxy.h</span><span style="COLOR: #000000">"</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>#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;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><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></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;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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_73_183_Open_Image onclick="this.style.display='none'; Codehighlighter1_73_183_Open_Text.style.display='none'; Codehighlighter1_73_183_Closed_Image.style.display='inline'; Codehighlighter1_73_183_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_73_183_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_73_183_Closed_Text.style.display='none'; Codehighlighter1_73_183_Open_Image.style.display='inline'; Codehighlighter1_73_183_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_73_183_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_73_183_Open_Text><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/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Subject</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;proxy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Proxy();<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;proxy</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">request();<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>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;proxy;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;proxy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">14</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">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</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/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>
<img src ="http://www.cppblog.com/wolf/aggbug/124599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2010-08-25 00:37 <a href="http://www.cppblog.com/wolf/articles/124599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见设计模式之工厂模式（Factory Method）</title><link>http://www.cppblog.com/wolf/articles/122610.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Mon, 09 Aug 2010 16:30:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/122610.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/122610.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/122610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/122610.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/122610.html</trackback:ping><description><![CDATA[<p>前面已经介绍过简单工厂模式，并提及虽然简单工厂模式有很多优点，但其破坏了开发-封闭原则（Open-Close Principle，对扩展开发，对修改关闭）。即每增加一种算法，都要对工厂类进行修改。<br>在这里将简单工厂模式稍作改进，既成了工厂方法模式。<br>定义一个用于创建对象的接口，让子类决定实例化哪一个类，工厂方法使得一个类的实例化延迟到其子类。</p>
UML类图：<br><img height=546 alt="" src="http://www.cppblog.com/images/cppblog_com/wolf/FMethod.jpg" width=1023 border=0>&nbsp;
<img src ="http://www.cppblog.com/wolf/aggbug/122610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2010-08-10 00:30 <a href="http://www.cppblog.com/wolf/articles/122610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见设计模式之简单工厂模式（Static Factory Method）</title><link>http://www.cppblog.com/wolf/articles/122609.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Mon, 09 Aug 2010 13:34:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/122609.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/122609.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/122609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/122609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/122609.html</trackback:ping><description><![CDATA[<p>简单工厂模式又被称为静态工厂模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式，可以理解为是不同工厂模式的一个特殊实现。</p>
<br>UML类图：<br><img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wolf/StaticFactory.jpg" width=660 border=0>&nbsp;<br>类图中只列出主要方法，而只有工厂类中给出了构造和析构函数，并且都是私有。目的是强调这个工厂类的作用只是&#8220;出产品&#8221;，自己不需要实例化，所以将构造和析构声明为私有（这个只适用于&#8220;简单&#8221;工厂模式）。<br>代码（为减小篇幅，代码只实现部分，并code到一个cpp文件中）：<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: #000000">#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;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></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;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;5</span><span style="COLOR: #000000"><img id=Codehighlighter1_43_75_Open_Image onclick="this.style.display='none'; Codehighlighter1_43_75_Open_Text.style.display='none'; Codehighlighter1_43_75_Closed_Image.style.display='inline'; Codehighlighter1_43_75_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_43_75_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_43_75_Closed_Text.style.display='none'; Codehighlighter1_43_75_Open_Image.style.display='inline'; Codehighlighter1_43_75_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_43_75_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_43_75_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;@brief&nbsp;Base&nbsp;operation&nbsp;class.</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">&nbsp;6</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Operation<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_92_374_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_374_Open_Text.style.display='none'; Codehighlighter1_92_374_Closed_Image.style.display='inline'; Codehighlighter1_92_374_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_92_374_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_374_Closed_Text.style.display='none'; Codehighlighter1_92_374_Open_Image.style.display='inline'; Codehighlighter1_92_374_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_92_374_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_92_374_Open_Text><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/InBlock.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;9</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">double</span><span style="COLOR: #000000">&nbsp;m_numA;<br></span><span style="COLOR: #008080">10</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">double</span><span style="COLOR: #000000">&nbsp;m_numB;<br></span><span style="COLOR: #008080">11</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">12</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">13</span><span style="COLOR: #000000"><img id=Codehighlighter1_198_253_Open_Image onclick="this.style.display='none'; Codehighlighter1_198_253_Open_Text.style.display='none'; Codehighlighter1_198_253_Closed_Image.style.display='inline'; Codehighlighter1_198_253_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_198_253_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_198_253_Closed_Text.style.display='none'; Codehighlighter1_198_253_Open_Image.style.display='inline'; Codehighlighter1_198_253_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Operation():&nbsp;m_numA(</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000">),&nbsp;m_numB(</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_198_253_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_198_253_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Operation&nbsp;constructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">15</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">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img id=Codehighlighter1_281_335_Open_Image onclick="this.style.display='none'; Codehighlighter1_281_335_Open_Text.style.display='none'; Codehighlighter1_281_335_Closed_Image.style.display='inline'; Codehighlighter1_281_335_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_281_335_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_281_335_Closed_Text.style.display='none'; Codehighlighter1_281_335_Open_Image.style.display='inline'; Codehighlighter1_281_335_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Operation()&nbsp;</span><span id=Codehighlighter1_281_335_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_281_335_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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Operation&nbsp;destructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">19</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">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">21</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">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;getResult()&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</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">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 id=Codehighlighter1_378_427_Open_Image onclick="this.style.display='none'; Codehighlighter1_378_427_Open_Text.style.display='none'; Codehighlighter1_378_427_Closed_Image.style.display='inline'; Codehighlighter1_378_427_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_378_427_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_378_427_Closed_Text.style.display='none'; Codehighlighter1_378_427_Open_Image.style.display='inline'; Codehighlighter1_378_427_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_378_427_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_378_427_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;@brief&nbsp;The&nbsp;class&nbsp;implement&nbsp;the&nbsp;add&nbsp;operation.</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">25</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;OperAdd:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Operation<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img id=Codehighlighter1_460_733_Open_Image onclick="this.style.display='none'; Codehighlighter1_460_733_Open_Text.style.display='none'; Codehighlighter1_460_733_Closed_Image.style.display='inline'; Codehighlighter1_460_733_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_460_733_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_460_733_Closed_Text.style.display='none'; Codehighlighter1_460_733_Open_Image.style.display='inline'; Codehighlighter1_460_733_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_460_733_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_460_733_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">27</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">28</span><span style="COLOR: #000000"><img id=Codehighlighter1_502_595_Open_Image onclick="this.style.display='none'; Codehighlighter1_502_595_Open_Text.style.display='none'; Codehighlighter1_502_595_Closed_Image.style.display='inline'; Codehighlighter1_502_595_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_502_595_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_502_595_Closed_Text.style.display='none'; Codehighlighter1_502_595_Open_Image.style.display='inline'; Codehighlighter1_502_595_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;OperAdd(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;b)&nbsp;</span><span id=Codehighlighter1_502_595_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_502_595_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">OperAdd&nbsp;constructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_numA&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_numB&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b;<br></span><span style="COLOR: #008080">32</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">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img id=Codehighlighter1_613_665_Open_Image onclick="this.style.display='none'; Codehighlighter1_613_665_Open_Text.style.display='none'; Codehighlighter1_613_665_Closed_Image.style.display='inline'; Codehighlighter1_613_665_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_613_665_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_613_665_Closed_Text.style.display='none'; Codehighlighter1_613_665_Open_Image.style.display='inline'; Codehighlighter1_613_665_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">OperAdd()&nbsp;</span><span id=Codehighlighter1_613_665_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_613_665_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">OperAdd&nbsp;destructor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">36</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">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img id=Codehighlighter1_691_731_Open_Image onclick="this.style.display='none'; Codehighlighter1_691_731_Open_Text.style.display='none'; Codehighlighter1_691_731_Closed_Image.style.display='inline'; Codehighlighter1_691_731_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_691_731_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_691_731_Closed_Text.style.display='none'; Codehighlighter1_691_731_Open_Image.style.display='inline'; Codehighlighter1_691_731_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;getResult()&nbsp;</span><span id=Codehighlighter1_691_731_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_691_731_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(m_numA&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;m_numB);<br></span><span style="COLOR: #008080">40</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">41</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">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 id=Codehighlighter1_737_796_Open_Image onclick="this.style.display='none'; Codehighlighter1_737_796_Open_Text.style.display='none'; Codehighlighter1_737_796_Closed_Image.style.display='inline'; Codehighlighter1_737_796_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_737_796_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_737_796_Closed_Text.style.display='none'; Codehighlighter1_737_796_Open_Image.style.display='inline'; Codehighlighter1_737_796_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_737_796_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_737_796_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;@brief&nbsp;The&nbsp;class&nbsp;OperSub,&nbsp;OperMul&nbsp;and&nbsp;OperDiv&nbsp;omitted.&nbsp;</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">44</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">45</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;OperFactory<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img id=Codehighlighter1_816_997_Open_Image onclick="this.style.display='none'; Codehighlighter1_816_997_Open_Text.style.display='none'; Codehighlighter1_816_997_Closed_Image.style.display='inline'; Codehighlighter1_816_997_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_816_997_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_816_997_Closed_Text.style.display='none'; Codehighlighter1_816_997_Open_Image.style.display='inline'; Codehighlighter1_816_997_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_816_997_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_816_997_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">47</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">48</span><span style="COLOR: #000000"><img id=Codehighlighter1_845_918_Open_Image onclick="this.style.display='none'; Codehighlighter1_845_918_Open_Text.style.display='none'; Codehighlighter1_845_918_Closed_Image.style.display='inline'; Codehighlighter1_845_918_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_845_918_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_845_918_Closed_Text.style.display='none'; Codehighlighter1_845_918_Open_Image.style.display='inline'; Codehighlighter1_845_918_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;OPER_TYPE&nbsp;</span><span id=Codehighlighter1_845_918_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_845_918_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</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/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MUL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIV&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">53</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">54</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">55</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">static</span><span style="COLOR: #000000">&nbsp;Operation</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;createOperation(OPER_TYPE&nbsp;oper,&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;b);<br></span><span style="COLOR: #008080">56</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">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>Operation</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;OperFactory::createOperation(OPER_TYPE&nbsp;oper,&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;b)&nbsp;<br></span><span style="COLOR: #008080">59</span><span style="COLOR: #000000"><img id=Codehighlighter1_1078_1247_Open_Image onclick="this.style.display='none'; Codehighlighter1_1078_1247_Open_Text.style.display='none'; Codehighlighter1_1078_1247_Closed_Image.style.display='inline'; Codehighlighter1_1078_1247_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1078_1247_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1078_1247_Closed_Text.style.display='none'; Codehighlighter1_1078_1247_Open_Image.style.display='inline'; Codehighlighter1_1078_1247_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1078_1247_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_1078_1247_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">60</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Operation</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pOper&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br></span><span style="COLOR: #008080">61</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">62</span><span style="COLOR: #000000"><img id=Codehighlighter1_1128_1226_Open_Image onclick="this.style.display='none'; Codehighlighter1_1128_1226_Open_Text.style.display='none'; Codehighlighter1_1128_1226_Closed_Image.style.display='inline'; Codehighlighter1_1128_1226_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1128_1226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1128_1226_Closed_Text.style.display='none'; Codehighlighter1_1128_1226_Open_Image.style.display='inline'; Codehighlighter1_1128_1226_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(oper)&nbsp;</span><span id=Codehighlighter1_1128_1226_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_1128_1226_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">63</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">case</span><span style="COLOR: #000000">&nbsp;ADD:<br></span><span style="COLOR: #008080">64</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pOper&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;OperAdd(a,&nbsp;b);<br></span><span style="COLOR: #008080">65</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">66</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">default</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">67</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">68</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">69</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">70</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">return</span><span style="COLOR: #000000">&nbsp;pOper;<br></span><span style="COLOR: #008080">71</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">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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">74</span><span style="COLOR: #000000"><img id=Codehighlighter1_1261_1472_Open_Image onclick="this.style.display='none'; Codehighlighter1_1261_1472_Open_Text.style.display='none'; Codehighlighter1_1261_1472_Closed_Image.style.display='inline'; Codehighlighter1_1261_1472_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1261_1472_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1261_1472_Closed_Text.style.display='none'; Codehighlighter1_1261_1472_Open_Image.style.display='inline'; Codehighlighter1_1261_1472_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1261_1472_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_1261_1472_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">75</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Operation</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pOper&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;OperFactory::createOperation(OperFactory::ADD,&nbsp;</span><span style="COLOR: #000000">2.1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3.3</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">76</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">77</span><span style="COLOR: #000000"><img id=Codehighlighter1_1360_1455_Open_Image onclick="this.style.display='none'; Codehighlighter1_1360_1455_Open_Text.style.display='none'; Codehighlighter1_1360_1455_Closed_Image.style.display='inline'; Codehighlighter1_1360_1455_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1360_1455_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1360_1455_Closed_Text.style.display='none'; Codehighlighter1_1360_1455_Open_Image.style.display='inline'; Codehighlighter1_1360_1455_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(pOper)&nbsp;</span><span id=Codehighlighter1_1360_1455_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_1360_1455_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">78</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;pOper</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getResult()&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">79</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">80</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pOper;<br></span><span style="COLOR: #008080">81</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pOper&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br></span><span style="COLOR: #008080">82</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">83</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">84</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">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">85</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断，根据客户端的选择条件动态实例化相关的类，对于客户端来说，去除了与具体产品的依赖。但简单工厂模式的工厂类是开放的，如果要增加其它产品，则要修改工厂类，这一点违背开放-封闭原则（Open-Close Principle，对扩展开发，对修改关闭）。而要克服这一缺点，则要使用工厂方法模式（Factory Method），这种经过改进工厂模式将在下一节介绍。 
<img src ="http://www.cppblog.com/wolf/aggbug/122609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2010-08-09 21:34 <a href="http://www.cppblog.com/wolf/articles/122609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见设计模式之模板方法模式（Template Method）</title><link>http://www.cppblog.com/wolf/articles/122607.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Mon, 09 Aug 2010 10:09:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/122607.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/122607.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/122607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/122607.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/122607.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 模板方法模式是一种很简单但却很常见的设计模式，它常常在不知不觉中被使用。概念：定义一个操作中的算法的骨架，而将具体的执行步骤延迟到子类中。模板方法使得子类可以不改变算法的结构而只是重新定义算法的步骤，使得不同步骤产生不同的效果。说的更简单点，就是执行的框架由基类来定，而框架中的方法及执行顺序由子类来重定义。UML类图：&nbsp;上图的代码很好实现，就是基类的模板函数中调用了operation1和...&nbsp;&nbsp;<a href='http://www.cppblog.com/wolf/articles/122607.html'>阅读全文</a><img src ="http://www.cppblog.com/wolf/aggbug/122607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2010-08-09 18:09 <a href="http://www.cppblog.com/wolf/articles/122607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见设计模式之单件类（Singleton）</title><link>http://www.cppblog.com/wolf/articles/120840.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Mon, 19 Jul 2010 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/120840.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/120840.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/120840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/120840.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/120840.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 所谓的单件类就是保证一个类仅有一个实例，并提供一个访问它的全局访问点。&nbsp;Singleton可以看作是一种经过改进的全局变量，既在一个进程中只能有唯一的实例，不允许产生第二个这样的对象。虽然单件类是最简单的设计模式，但仍需小心使用，主要需注意：1.构造函数既然是只能有一个实例，那么构造函数自然不能被外部随意调用，所以需要将其声明为私有（private），包括默认构造、拷...&nbsp;&nbsp;<a href='http://www.cppblog.com/wolf/articles/120840.html'>阅读全文</a><img src ="http://www.cppblog.com/wolf/aggbug/120840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2010-07-19 23:39 <a href="http://www.cppblog.com/wolf/articles/120840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C和C++之间库的互相调用</title><link>http://www.cppblog.com/wolf/articles/77828.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Wed, 25 Mar 2009 06:34:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/77828.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/77828.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/77828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/77828.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/77828.html</trackback:ping><description><![CDATA[<p>昨晚有个朋友问我关于在C中调用C++库的问题，今天午饭后，由于脖子痛的厉害而没有加入到我们组的&#8220;每天一战&#8221;的行列中去，所以正好将C和C++之间的库调用关系做个总结。</p>
<p>1.extern "C"的理解：<br>很多人认为"C"表示的C语言，实际并非如此，"C"表示的是一种链接约定，只是因C和C++语言之间的密切关系而在它们之间更多的应用而已。实际上Fortran和汇编语言也常常使用，因为它们也正好符合C实现的约定。<br>extern "C"指令描述的是一种链接约定，它并不影响调用函数的定义，即时做了该声明，对函数类型的检查和参数转换仍要遵循C++的标准，而不是C。</p>
<p>2.extern "C"的作用：<br>不同的语言链接性是不同的，那么也决定了它们编译后的链接符号的不同，比如一个函数void fun(double d)，C语言会把它编译成类似_fun这样的符号，C链接器只要找到该函数符号就可以链接成功，它假设参数类型信息是正确的。而C++会把这个函数编译成类似_fun_double或_xxx_funDxxx这样的符号，在符号上增加了类型信息，这也是C++可以实现重载的原因。<br>那么，对于用C编译器编译成的库，用C++直接链接势必会出现不能识别符号的问题，是的，需要extern "C"的时刻来了，它就是干这个用的。extern "C" 的作用就是让编译器知道要以C语言的方式编译和连接封装函数。</p>
<p>3.在C++中调用C库的例子：<br>1).做一个C动态库：<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: #008000">//</span><span style="COLOR: #008000">&nbsp;hello.c:</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;hello()<br>{<br>&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>}</span></div>
<p>&nbsp;</p>
<p>编译并copy到系统库目录下(也可以自己定义库目录，man ldconfig):<br>[root@coredump test]# gcc --shared -o libhello.so hello.c<br>[root@coredump test]# cp libhello.so /lib/<br>2).写个C++程序去调用它：<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: #008000">//</span><span style="COLOR: #008000">&nbsp;test.cpp</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#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><br>#ifdef&nbsp;__cplusplus<br></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;告诉编译器下列代码要以C链接约定的模式进行链接</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;hello();<br><br>#ifdef&nbsp;__cplusplus<br>}<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;hello();<br><br>&nbsp;&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></div>
<p><br>编译并运行：<br>[root@coredump test]# g++ test.cpp -o test -lhello<br>[root@coredump test]# ./test<br>hello<br>[root@coredump test]#<br>3).__cplusplus宏的条件编译：<br>为什么要加这个条件编译呢？小沈阳有话：小妹，这是为什么呢？<br>因为这种技术也可能会用在由C头文件产生出的C++文件中，这样使用是为了建立起公共的C和C++文件，也就是保证当这个文件被用做C文件编译时，可以去掉C++结构，也就是说，extern "C"语法在C编译环境下是不允许的。<br>比如：将上面的test.cpp更名为test.c，将头文件改为stdio.h，将条件编译去掉，再用gcc编译就可以看到效果。而即使做了上面的修改，如果用g++编译就可以正常使用，这就是我上面说的&#8220;公共的C和C++文件&#8221;的意思。</p>
<p>4.C调用C++库：<br>C++调用C库看上去也不是那么困难，因为C++本身就有向前(向C)兼容的特性，再加上纯天然的extern "C"约定，使得一切都是那么自然。而让C调用C++的库似乎就没那么容易，不过也不是不可以的。<br>说到这里我得休息一下，大中午的，出去抽根烟先，不过我也相信如果你不知道答案，看到这里的时候肯定在到处找板砖，恨不得敲开我的脑壳子。我能理解，我也习惯了，我有个学姐一看到我第一反应就是扔出一块砖头先！<br>言归正传，还是要借助这纯天然的extern "C"。</p>
<p>1)做一个C++库：<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: #008000">//</span><span style="COLOR: #008000">&nbsp;world.cpp</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#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><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;world()<br>{<br>&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">world</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br>}</span></div>
<p><br>编译并copy到系统库目录下:<br>[root@coredump test]# g++ --shared -o libworld.so world.cpp<br>[root@coredump test]# cp libworld.so /lib/<br>2)做一个中间接口库，对C++库进行二次封装：<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: #008000">//</span><span style="COLOR: #008000">&nbsp;mid.cpp</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#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><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;world();<br><br>#ifdef&nbsp;__cplusplus<br></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;{&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;即使这是一个C++程序，下列这个函数的实现也要以C约定的风格来搞！</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;m_world()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;world();<br>&nbsp;&nbsp;}<br><br>#ifdef&nbsp;__cplusplus<br>}<br></span><span style="COLOR: #0000ff">#endif</span></div>
<p><br>其中方法m_world即为libworld库中world方法的二次封装，编译并copy到系统库目录下:<br>[root@coredump test]# g++ --shared -o libmid.so mid.cpp -lworld<br>[root@coredump test]# cp libmid.so /lib/<br>3).C程序通过链接二次接口库去调用C++库：<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: #008000">//</span><span style="COLOR: #008000">&nbsp;test.c</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;m_world();<br><br>&nbsp;&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></div>
<p><br>编译并运行：<br>[root@coredump test]# gcc test.c -l mid -o test<br>[root@coredump test]# ./test<br>world<br>[root@coredump test]# <br>注：如果对于C++库中含有类的，可以在二次接口函数中生成临时对象来调用对应的功能函数，当然要根据实际情况来定了。</p>
<p>5.靠，过了午休时间了，收工！</p>
<img src ="http://www.cppblog.com/wolf/aggbug/77828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2009-03-25 14:34 <a href="http://www.cppblog.com/wolf/articles/77828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux中的动态库和静态库</title><link>http://www.cppblog.com/wolf/articles/74928.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Wed, 25 Feb 2009 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/74928.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/74928.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/74928.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/74928.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/74928.html</trackback:ping><description><![CDATA[<p><br>1.概念和区别：<br>&nbsp;&nbsp;&nbsp; 静态库就是在编译过程中一些目标文件的集合。静态库在程序链接的时候使用，链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中。一旦链接完成，在执行程序的时候就不需要静态库了。 <br>&nbsp;&nbsp;&nbsp; 由于每个使用静态库的应用程序都需要拷贝所用函数的代码，所以静态链接的文件会比较大。</p>
<p>&nbsp;&nbsp;&nbsp; 相对于静态函数库，动态函数库在编译的时候并没有被编译进目标代码中，而只是作些标记。然后在程序开始启动运行的时候，动态地加载所需模块，因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序，而是程序运行时动态的申请并调用，所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序，所以动态函数库的升级比较方便。</p>
<p>2.命名：<br>&nbsp;&nbsp;&nbsp; 静态库的名字一般为libxxxx.a，其中xxxx是该lib的名称。<br>&nbsp;&nbsp;&nbsp; 动态库的名字一般为libxxxx.so.major.minor，xxxx是该lib的名称，major是主版本号，minor是副版本号。版本号也可以没有，一般都会建立个没有版本号的软连接文件链接到全名的库文件。</p>
<p>3.创建：<br>无论静态库还是动态库，创建都分为两步，第一步创建目标文件，第二步生产库。<br>1).静态库的创建：<br>#gcc -c test.c -o test.o<br>#ar rcs libtest.a test.o<br>名字为libtest.a的静态库就生产了，其中选项：<br>r 表明将模块加入到静态库中；<br>c 表示创建静态库；<br>s 表示生产索引；<br>还有更多选项像增加、删除库中的目标文件，包括将静态库解包等可以通过man来获得。<br>2).动态库的创建：<br>#gcc -fPIC -c test.c -o test.c<br>#gcc --share test.o -o libtest.so<br>-fPIC 为了跨平台</p>
<p>4.使用：<br>编译链接目标程序的方法是一样的：<br>#gcc main.c -L. -ltest -o main<br>-L.指定现在本目录下搜索库，如果没有，会到系统默认的目录下搜索，一般为/lib、/usr/lib下。<br>对于静态库，这个步骤之后就可以将libtest.a库删掉，因为它已经被编译进了目标程序，不再需要它了。<br>而对于动态库，libtest.so库只是在目标程序里做了标记，在运行程序时才会动态加载，那么从哪加载呢？加载目录会由/etc/ld.so.conf来指定，一般默认是/lib、/usr/lib，所以要想让动态库顺利加载，你可以将库文件copy到上面的两个目录下，或者设置export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX/YYY，后面为你自己动态库的目录，再或者修改/etc/ld.so.conf文件，把库所在的路径加到文件末尾，并执行ldconfig刷新。这样，加入的目录下的所有库文件都可见。</p>
<p>另外还有个文件需要了解/etc/ld.so.cache，里面保存了常用的动态函数库，且会先把他们加载到内存中，因为内存的访问速度远远大于硬盘的访问速度，这样可以提高软件加载动态函数库的速度了。</p>
<p>最后提一点，当同一目录下既有动态库又有静态库，并且两个库的名字相同时，编译时会如何链接呢？</p>
<p>gcc编译时默认都是动态链接，如果要指定优先链接静态库，需要指定参数static。</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/wolf/aggbug/74928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2009-02-25 23:10 <a href="http://www.cppblog.com/wolf/articles/74928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的强制类型转换</title><link>http://www.cppblog.com/wolf/articles/71835.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Mon, 12 Jan 2009 15:22:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/71835.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/71835.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/71835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/71835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/71835.html</trackback:ping><description><![CDATA[


<p>在C++中，除了支持C语言中的隐式类型转换外，同时引入了四种显示的类型转换函数，以确切的标识出正在进行的转换类型。<br>函数原型为（均为模板函数）：<br>static_cast&lt;new_type&gt;(expression)<br>const_cast&lt;new_type&gt;(expression)<br>reinterpret_cast&lt;new_type&gt;(expression)<br>dynamic_cast&lt;new_type&gt;(expression)</p>
<p>前三个是在编译时期进行类型转换的，而最后一个则是在运行时期进行转换的，即dynamic_cast函数需要RTTI的支持，如果是VC下，需要手动打开RTTI支持选项。</p>
<p>static_cast主要完成相关类型之间的转换，比如整型到枚举、整型到浮点等。但static_cast不能转换掉expression的const、volitale、或者__unaligned属性</p>
<p>const_cast一般用于强制消除对象的常量性，它是唯一能做到这一点的 C++ 风格的强制转型，但需注意的是只能转换指针或引用类型，而不能转换普通常量类型。<br>如：<br>const int a = 1;<br>int b =&nbsp;const_cast&nbsp;&lt;int&gt;(a);<br>是错误的。</p>
<p>reinterpret_cast用于字节数相同的类型之间的转换，常用的就是整型和指针之间、函数指针类型之间进行转换。操作符仅仅重新解释了对象的比特模型而没有进行二进制转换，需谨慎使用，一般只在把类型映射回原有类型时使用。</p>
<p>dynamic_cast主要用于类层次间的上行转换和下行转换，还可以用于类之间的交叉转换。<br>在类层次间进行上行转换时，dynamic_cast和static_cast的效果是一样的；<br>在进行下行转换时，dynamic_cast具有类型检查的功能，比static_cast更安全。<br>你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用，而且你能知道转换是否成功。失败的转换将返回空指针（当对指针进行类型转换时）或者抛出异常（当对引用进行类型转换时）。<br></p><img src ="http://www.cppblog.com/wolf/aggbug/71835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2009-01-12 23:22 <a href="http://www.cppblog.com/wolf/articles/71835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注意C++ STL容器中erase的使用</title><link>http://www.cppblog.com/wolf/articles/70368.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Thu, 25 Dec 2008 16:03:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/70368.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/70368.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/70368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/70368.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/70368.html</trackback:ping><description><![CDATA[<p>erase()函数的功能是用来删除容器中的元素<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: #000000">函数原型:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>iterator&nbsp;erase(iterator&nbsp;where);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>iterator&nbsp;erase(iterator&nbsp;first,iterator&nbsp;last);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>basic_string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;erase(size_type&nbsp;p0</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,size_type&nbsp;n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">np);</span></div>
<p><br>删除某个容器里的某个元素：c.erase(T);<br>看似一个简单的动作，然而对不同类型的容器，内部却做了截然不同的事情，后面介绍。</p>
<p>假设有这样一个题目，将某个容器中所有满足条件N == X的元素删除，按照常规的思路应该有类似这样的代码：<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: #008000">//</span><span style="COLOR: #008000">&nbsp;假设Container和container分别表示一种容器和对应的一个对象</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">Container</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;it;<br></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;container.begin();&nbsp;it&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;container.end();&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">it)&nbsp;{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(N&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;X)<br>&nbsp;&nbsp;&nbsp;&nbsp;container.erase(it);<br>}</span></div>
<p><br>然而这样的代码对于任一种容器都是错误的<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emsad.gif" align=absMiddle border=0><br>容器按内存分配方式可以分为链表容器和数组容器。<br>所谓的链表容器指的是一种表现方式，包括list、slist等这样基于节点的容器（动态分配内存块）和set、map、multiset、multimap等关联容器（平衡树实现），而数组容器指的是在一块连续的内存上保存元素的连续内存容器，比如vector、deque、string等。</p>
<p>OK，现在说说erase对他们的操作，链表容器以list为例，当执行container.erase(it)时，确实第一个满足条件的元素删除了，但这时it指针已经被删除了，它也不指向任何元素了，所以也只能到此为止了，也就是说上面的代码对于链表容器来说只能正确删除第一个满足条件的元素，针对这个问题我们首先想到的就是在删除指针之前，给其做个备份，很好，不错的主意，我们一般采用的方法是建立个临时变量，这个临时变量可以在程序循环中适当的位置使用，看下列代码实现，是将这个临时变量直接建立在erase实现里，这样做更简洁，也显得专业些<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emsmile.gif" align=absMiddle border=0>（以删除int型链表中所有偶数为例，也是大家都喜欢的一个例子）：<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: #000000">&nbsp;&nbsp;list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;it;&nbsp;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;lt.begin();&nbsp;it&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;lt.end();&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">it&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lt.erase(it</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">it;<br>&nbsp;&nbsp;}</span></div>
<p>链表容器使用erase删除节点还有一个特点，就是会将下一个元素的地址返回，所以也可以这样实现：</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: #000000">&nbsp;&nbsp;list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;it;&nbsp;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;lt.begin();&nbsp;it&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;lt.end();&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">it&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;lt.erase(it);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">it;<br>&nbsp;&nbsp;}</span></div>
<p><br>当然用list容器本身提供的算法也是个不错的主意（挂回调）：</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: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;evenNumber(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(n&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br>&nbsp;&nbsp;<br>&nbsp;&nbsp;lt.remove_if(evenNumber);</span></div>
<p><br>数组容器以vector为例，当执行container.erase(it)时，和上面提到的一样，第一个满足条件的元素删除了，但这时数组容器不允许中间有&#8220;空隙&#8221;，所以会做个大动作，就是将被删元素后面所有的元素前移（参考STL源码），而数组容器记录的是下标，所以删除元素后，当前下标定位的元素也就顺理成章的变成了原有队列中的下一个元素，同样以删除偶数为例，代码如下：</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: #000000">&nbsp;&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v.begin();<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v.begin();&nbsp;it&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;v.end();&nbsp;)&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">it&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.erase(it);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">it;<br>&nbsp;&nbsp;}</span></div>
<p>也可以使用reverse_iterator迭代器，并且在某些删除操作中会有更好的效率（因为它会使上面提到的&#8220;大动作&#8221;变小一些）：</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: #000000">&nbsp;&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::reverse_iterator&nbsp;ri&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v.rbegin();<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;;&nbsp;ri&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;v.rend();&nbsp;)&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ri&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.erase((</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">ri).</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">());<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">ri;<br>&nbsp;&nbsp;}</span></div>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/wolf/aggbug/70368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-12-26 00:03 <a href="http://www.cppblog.com/wolf/articles/70368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析C++ 大三律</title><link>http://www.cppblog.com/wolf/articles/68785.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Sun, 07 Dec 2008 13:14:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/68785.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/68785.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/68785.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/68785.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/68785.html</trackback:ping><description><![CDATA[<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'">C++<font face=宋体>中几乎</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>所有的类都有</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>拷贝</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>构造函数，析构函数和赋值操作符</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>重载函数，即使你不显示定义，编译器也会自动生成的，</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>它们提供的都是一些最基本的功能</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>。</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>拷贝</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>构造函数</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>：</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>一种特殊的构造函数，他由编译器调用来完成一些基于同一类的其他对象的构件及初始化；</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>析构函数</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>：</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>摧毁一个对象并保证它被彻底清除；</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>赋值操作符</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>：以已有对象为蓝本</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>给</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>另一</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>对象进行新的</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>赋</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><font face=宋体>值。</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>所谓的大三律（rule&nbsp;of&nbsp;three,&nbsp;the&nbsp;law&nbsp;of&nbsp;the&nbsp;big&nbsp;three&nbsp;or&nbsp;the&nbsp;big&nbsp;three）正是在规则他们之间的关系：</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>1.如果类定义了析构函数，那么也应该定义拷贝构造和赋值运算符；</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>2.如果类含有需要动态分配的成员，那么该类必须定义拷贝构造和赋值运算符；</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体>一句话，析构函数、拷贝构造、赋值运算符重载应该总是同时出现。下面一个简单的例子程序对这个定律做了论证：</font></span></p>
<p class=p0 style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt"><span style="FONT-SIZE: 10pt; FONT-FAMILY: '宋体'; mso-spacerun: 'yes'"><font face=宋体></font></span></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;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">&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;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></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;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;5</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;Test<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_54_209_Open_Image onclick="this.style.display='none'; Codehighlighter1_54_209_Open_Text.style.display='none'; Codehighlighter1_54_209_Closed_Image.style.display='inline'; Codehighlighter1_54_209_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_54_209_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_209_Closed_Text.style.display='none'; Codehighlighter1_54_209_Open_Image.style.display='inline'; Codehighlighter1_54_209_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_54_209_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_54_209_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</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/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test()&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_82_121_Open_Image onclick="this.style.display='none'; Codehighlighter1_82_121_Open_Text.style.display='none'; Codehighlighter1_82_121_Closed_Image.style.display='inline'; Codehighlighter1_82_121_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_82_121_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_82_121_Closed_Text.style.display='none'; Codehighlighter1_82_121_Open_Image.style.display='inline'; Codehighlighter1_82_121_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_82_121_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_82_121_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_pdata&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">];&nbsp;<br></span><span style="COLOR: #008080">11</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">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">13</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: #000000">~</span><span style="COLOR: #000000">Test()&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_142_174_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_174_Open_Text.style.display='none'; Codehighlighter1_142_174_Closed_Image.style.display='inline'; Codehighlighter1_142_174_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_142_174_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_174_Closed_Text.style.display='none'; Codehighlighter1_142_174_Open_Image.style.display='inline'; Codehighlighter1_142_174_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_142_174_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_142_174_Open_Text><span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;_pdata;&nbsp;<br></span><span style="COLOR: #008080">16</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">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</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/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;_pdata;<br></span><span style="COLOR: #008080">20</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">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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img id=Codehighlighter1_225_273_Open_Image onclick="this.style.display='none'; Codehighlighter1_225_273_Open_Text.style.display='none'; Codehighlighter1_225_273_Closed_Image.style.display='inline'; Codehighlighter1_225_273_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_225_273_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_225_273_Closed_Text.style.display='none'; Codehighlighter1_225_273_Open_Image.style.display='inline'; Codehighlighter1_225_273_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_225_273_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_225_273_Open_Text><span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Test&nbsp;a;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Test&nbsp;b;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a;<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/InBlock.gif" align=top>&nbsp;&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">31</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">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
上面这么一段简单的代码看似没什么问题，然而却隐藏着严重的内存泄露。<br>在25行定义了一个类的对象，同时对象a中的数据成员_pdata也在堆中分配了内存，同理26行对对象b做了同样的事情，然而28行处将a赋值给b，默认赋值运算符做的是对数据成员逐个的赋值，或者说是做了浅拷贝，所以对象b中的成员_pdata指向了跟对象a中的_pdata的同一块内存，在析构的时候就会产生a中的_pdata指向的那块内存被释放了两次，而原先对象b中分配的内存却没有释放的问题。<br>如果将26、28行换成Test b = a或Test b(a)，结果是一样的，不同的是调用的是拷贝构造函数。<br><br>既然知道了问题所在，那么解决的方法当然自己来定义拷贝构造和赋值运算符了，具体做法就不列举了。<br><br>在某些情况下，实现类的拷贝构造函数和赋值操作符是非常麻烦的时候，特别是确定程序中不会做拷贝和赋值操作的时候，去实现它们确实有点得不偿失。而不定义又怕出现上述问题，在这里有个巧妙（与其说巧妙不如说偷懒:-)）的方法，就是可以只将它们声明为private成员而不去实现它们。这样既可以防止了会有人去显示调用它们，也防止了编译器自动生成。<br><br>顺便提一下拷贝构造被调用的三种场合：<br>1.在声明语句中用一个对象初始化另一个对象；<br>2.将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本；<br>3.生成一个临时对象作为函数的返回结果；<br><!--endfragment-->
<img src ="http://www.cppblog.com/wolf/aggbug/68785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-12-07 21:14 <a href="http://www.cppblog.com/wolf/articles/68785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>返回static内部变量的陷阱</title><link>http://www.cppblog.com/wolf/articles/67811.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Tue, 25 Nov 2008 07:06:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/67811.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/67811.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/67811.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/67811.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/67811.html</trackback:ping><description><![CDATA[先看一个例子：<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: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</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>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><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>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><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><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></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;fun(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;src)<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_87_158_Open_Image onclick="this.style.display='none'; Codehighlighter1_87_158_Open_Text.style.display='none'; Codehighlighter1_87_158_Closed_Image.style.display='inline'; Codehighlighter1_87_158_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_87_158_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_158_Closed_Text.style.display='none'; Codehighlighter1_87_158_Open_Image.style.display='inline'; Codehighlighter1_87_158_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_87_158_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_87_158_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;dest[</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</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/InBlock.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;strcpy(dest,&nbsp;src);<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>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;dest;<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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id=Codehighlighter1_172_365_Open_Image onclick="this.style.display='none'; Codehighlighter1_172_365_Open_Text.style.display='none'; Codehighlighter1_172_365_Closed_Image.style.display='inline'; Codehighlighter1_172_365_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_172_365_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_172_365_Closed_Text.style.display='none'; Codehighlighter1_172_365_Open_Image.style.display='inline'; Codehighlighter1_172_365_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_172_365_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_172_365_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;s1[</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</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/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;s2[</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</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/InBlock.gif" align=top><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;strcpy(s1,&nbsp;fun(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">"</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/InBlock.gif" align=top>&nbsp;&nbsp;strcpy(s2,&nbsp;fun(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">world</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s&nbsp;%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;s1,&nbsp;s2);<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s&nbsp;%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;fun(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;fun(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">world</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">25</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">&nbsp;</span><span style="COLOR: #000000">0</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/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;&nbsp;&nbsp; 读一下这个程序，先看这个程序写的有问题没（假设fun函数的参数长度小于32）？如果你对这个程序中的fun函数返回一个局部变量的数组产生了疑问，那么我希望你是没注意到我使用的static类型，若你仍有疑问，建议你先回去查查static变量的作用域和生命周期的概念。<br>&nbsp;&nbsp;&nbsp; OK，是运行这个程序的时候了，看一下运行结果是否跟你想象的一样呢？如果是一样的，那么这篇文章你不用看了，因为你已经掌握了我下面要说的问题了。好吧，对于不理解运行结果的朋友，我们来分析一些下面那个printf语句，首先要知道printf中的表达式、函数的执行顺序是至右向左的，也就是先执行了fun("world")返回了dest的地址，然后再执行fun("hello")也返回了dest的地址，而这两次返回的dest用的同一块地址（因为是static类型），也就是第二次的执行覆盖了第一次执行的结果，对dest地址进行了重新的赋值，所以结果就是打印两个hello了。</p>
<p><br>&nbsp;&nbsp;&nbsp; 我们在写C/C++程序的时候，经常需要从调用函数中取得自己想要的数据，这就需要调用者和函数之间要有个内存的交互，我们通常采用的方法是传递一个指针给被调函数，作为被调函数的输出参数，这也是我们常用的、规范的做法。<br>&nbsp;&nbsp;&nbsp; 但有很多程序员比较习惯直接取返回值，这就面临一个问题就是普通局部变量都是在栈上分派的，会随着函数的结束而弹栈释放，那么就会出现返回局部变量数组的问题，这时有人会想到用malloc或new在堆上分派内存，没错，这样是避免了前面说的问题，但这样又会带来新的问题，就是需要在外部对这块内存进行释放，这个是比较难把握的，多次释放会出现程序的crash，忘记释放了会出现内存leak，所以这种方法也不被推荐。还有人想到了更另类的方法，就是上面例子中的static类型，没错，static变量也是全局的，但就会出现上面程序的运行结果（可以认为不是我们想要的结果，也就是错误的结果）。<br>&nbsp;&nbsp;&nbsp; 所以，我们要慎用返回函数内部的static内存的这种设计，但如果在无法改变设计模式的情况下（有些系统函数的实现，比如inet_ntoa，可以通过在man手册中看到这样的一句话：The string is returned in a statically allocated buffer, which subsequent calls will overwrite），那么在自己使用的时候一定要注意，不要试图保存返回的内存地址或引用，而要保存返回内存的内容，也就是例子程序中的strcpy两行。<br><br>inet_ntoa的错误使用（判断两个IP地址是否相等）：<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">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;in_addr&nbsp;addr1;<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></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;in_addr&nbsp;addr2;<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><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></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;网络包中包含了源地址</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">addr1.s_addr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x6500A8C0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;192.168.0.101</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">addr2.s_addr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x6600A8C0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;192.168.0.102<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;这个if语句将永远为真</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #008000"><img id=Codehighlighter1_214_234_Open_Image onclick="this.style.display='none'; Codehighlighter1_214_234_Open_Text.style.display='none'; Codehighlighter1_214_234_Closed_Image.style.display='inline'; Codehighlighter1_214_234_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_214_234_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_214_234_Closed_Text.style.display='none'; Codehighlighter1_214_234_Open_Image.style.display='inline'; Codehighlighter1_214_234_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strcmp(inet_ntoa(addr1),&nbsp;inet_ntoa(addr2))&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_214_234_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_214_234_Open_Text><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>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;do&nbsp;something</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img id=Codehighlighter1_241_263_Open_Image onclick="this.style.display='none'; Codehighlighter1_241_263_Open_Text.style.display='none'; Codehighlighter1_241_263_Closed_Image.style.display='inline'; Codehighlighter1_241_263_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_241_263_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_241_263_Closed_Text.style.display='none'; Codehighlighter1_241_263_Open_Image.style.display='inline'; Codehighlighter1_241_263_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_241_263_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_241_263_Open_Text><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>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;do&nbsp;other&nbsp;thing</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
<img src ="http://www.cppblog.com/wolf/aggbug/67811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-11-25 15:06 <a href="http://www.cppblog.com/wolf/articles/67811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三元运算符的使用</title><link>http://www.cppblog.com/wolf/articles/66898.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Fri, 14 Nov 2008 04:03:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/66898.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/66898.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/66898.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/66898.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/66898.html</trackback:ping><description><![CDATA[<p>三元运算符对于C程序员来说应该是很熟悉的了，有时它可以使代码更简洁、清晰，所以深得一部分程序员的喜爱，但在使用上是不是每一个程序员都知道它的准确用法呢？今天有人给我看了一个非常简单的程序，问我为什么编译出错，我才知道原来真的有人会忽略这个问题，代码如下：<br><span class=Apple-style-span style="WORD-SPACING: 0px; FONT: 16px Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0"></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: #000000">#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><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></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><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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_54_134_Open_Image onclick="this.style.display='none'; Codehighlighter1_54_134_Open_Text.style.display='none'; Codehighlighter1_54_134_Closed_Image.style.display='inline'; Codehighlighter1_54_134_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_54_134_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_134_Closed_Text.style.display='none'; Codehighlighter1_54_134_Open_Image.style.display='inline'; Codehighlighter1_54_134_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_54_134_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_54_134_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;(a&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;:&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><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">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>发现问题了吗？我让他把cout改成了printf，又让他仔细看了编译错误的信息，并且man printf看返回值。<br>是的，三元运算符的两个表达式是需要的int类型，而cout返回值是void*，看来我们常用的未必都是我们真正掌握的<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emsmile.gif" align=absMiddle border=0></span> 
<img src ="http://www.cppblog.com/wolf/aggbug/66898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-11-14 12:03 <a href="http://www.cppblog.com/wolf/articles/66898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用getopt分析命令行参数</title><link>http://www.cppblog.com/wolf/articles/63962.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Tue, 14 Oct 2008 07:56:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/63962.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/63962.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/63962.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/63962.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/63962.html</trackback:ping><description><![CDATA[<div style="PADDING-RIGHT: 5px; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); PADDING-BOTTOM: 4px; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,255)">getopt（）原型：</span></div>
<div style="PADDING-RIGHT: 5px; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); PADDING-BOTTOM: 4px; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;getopt(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;argv[],&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">optstring&nbsp;);</span></div>
参数argc、argv分别对应main函数的参数，表示参数个数和参数数组，optstring为选项字符串。getopt函数调用会返回第一个选项，如果以相同的参数再次调用的话会返回下一个选项，以此类推，当参数列已经到结尾时getopt()函数返回-1，当遇到一个未知的选项时 getopt 返回'?'，并且每次都会重新设置相应的全局变量。
<div>getopt()设置的全局变量包括：</div>
<div>1.optarg(char*) -- 指向当前选项参数的指针；</div>
<div>2.optind(int) &nbsp; -- 再次调用getopt()时的下一个argv指针的索引；</div>
<div>3.optopt(int) &nbsp; -- 最后一次调用getopt()返回的已知选项；</div>
<div>4.opterr(int) &nbsp; --&nbsp;变量opterr被初始化为1。如果不希望getopt()输出出错信息，将全域变量opterr设为0即可；</div>
<div>用一个自己应用到的例子来简单解析该函数：</div>
<div><span style="FONT-SIZE: 13px"><span style="COLOR: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="COLOR: rgb(0,0,0)">#include&nbsp;</span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)">stdio.h</span><span style="COLOR: rgb(0,0,0)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">&nbsp;2</span>&nbsp;<span style="COLOR: rgb(0,0,0)">#include&nbsp;</span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)">unistd.h</span><span style="COLOR: rgb(0,0,0)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">&nbsp;3</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)">&nbsp;main(</span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)">&nbsp;argc,&nbsp;</span><span style="COLOR: rgb(0,0,255)">char</span><span style="COLOR: rgb(0,0,0)">**</span><span style="COLOR: rgb(0,0,0)">&nbsp;argv&nbsp;)<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;5</span>&nbsp;<span style="COLOR: rgb(0,0,0)">{<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;6</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)">&nbsp;ch，destConsole = 0;&nbsp;<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;7</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)">&nbsp;def&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;8</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">char</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)">&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)">];<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;9</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">10</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;opterr&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">11</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">while</span><span style="COLOR: rgb(0,0,0)">&nbsp;((ch&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;getopt(argc,&nbsp;argv,&nbsp;</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">Of:h:p:</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">))</span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">)&nbsp;{<br></span><span style="COLOR: rgb(0,128,128)">12</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">switch</span><span style="COLOR: rgb(0,0,0)">(ch)&nbsp;{<br></span><span style="COLOR: rgb(0,128,128)">13</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">case</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">O</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">:<br></span><span style="COLOR: rgb(0,128,128)">14</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">]&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;optarg;<br></span><span style="COLOR: rgb(0,128,128)">15</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">break</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">16</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">case</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">f</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">:<br></span><span style="COLOR: rgb(0,128,128)">17</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">]&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;optarg;<br></span><span style="COLOR: rgb(0,128,128)">18</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">break</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">19</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">case</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">h</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">:<br></span><span style="COLOR: rgb(0,128,128)">20</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">2</span><span style="COLOR: rgb(0,0,0)">]&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;optarg;<br></span><span style="COLOR: rgb(0,128,128)">21</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">break</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">22</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">case</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">p</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">:<br></span><span style="COLOR: rgb(0,128,128)">23</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">3</span><span style="COLOR: rgb(0,0,0)">]&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;optarg;<br></span><span style="COLOR: rgb(0,128,128)">24</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">break</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">25</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">default</span><span style="COLOR: rgb(0,0,0)">:<br></span><span style="COLOR: rgb(0,128,128)">26</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">27</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: rgb(0,128,128)">28</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;}<br></span><span style="COLOR: rgb(0,128,128)">29</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">30</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;printf(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">buf[0]:&nbsp;%s\n</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">]);<br></span><span style="COLOR: rgb(0,128,128)">31</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;printf(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">buf[1]:&nbsp;%s\n</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">]);<br></span><span style="COLOR: rgb(0,128,128)">32</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;printf(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">buf[2]:&nbsp;%s\n</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,&nbsp;buf[</span><span style="COLOR: rgb(0,0,0)">2</span><span style="COLOR: rgb(0,0,0)">]);<br></span><span style="COLOR: rgb(0,128,128)">33</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;printf(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">buf[3]:&nbsp;%d\n</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,&nbsp;atoi(buf[</span><span style="COLOR: rgb(0,0,0)">3</span><span style="COLOR: rgb(0,0,0)">]));<br></span><span style="COLOR: rgb(0,128,128)">34</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">35</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">36</span>&nbsp;<span style="COLOR: rgb(0,0,0)">}</span></span><br></div>
<div><span style="FONT-SIZE: 13px">这是一个记录日志的程序部分代码（没做出错处理），同时支持终端输出、写文件、远程传输等功能（还有一些写数据库等，不一一列举）。</span></div>
<div><span style="FONT-SIZE: 13px">选项字符串为：&#8220;Of:h:p:&#8221;：</span></div>
<div><span style="FONT-SIZE: 13px">O表示是无参数选项，终端输出判断部分在14行，可以加一行给终端输出设置标记，比如destConsole=1，无参数自然对应30行就应该打印空；</span></div>
<div><span style="FONT-SIZE: 13px">f、h、p都为有参数选项，如果都有设置有效，那么对应的就会在31-33行分别打印文件名、主机名、端口号。</span></div>
<div><span style="FONT-SIZE: 13px">运行结果：</span></div>
<div><span style="FONT-SIZE: 13px">
<div>[root@develop-x /]# ./testOpt -O -f test.txt -h 192.168.0.111 -p 6666</div>
<div>buf[0]:&nbsp;</div>
<div>buf[1]: test.txt</div>
<div>buf[2]: 192.168.0.111</div>
<div>buf[3]: 6666</div>
<div>复杂命令行处理getopt_long()可以参考man和getopt()，主要是增强了长选项的功能。</div>
</span></div>
<img src ="http://www.cppblog.com/wolf/aggbug/63962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-10-14 15:56 <a href="http://www.cppblog.com/wolf/articles/63962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++构造函数调用构造函数的问题</title><link>http://www.cppblog.com/wolf/articles/63490.html</link><dc:creator>老狼</dc:creator><author>老狼</author><pubDate>Wed, 08 Oct 2008 10:51:00 GMT</pubDate><guid>http://www.cppblog.com/wolf/articles/63490.html</guid><wfw:comment>http://www.cppblog.com/wolf/comments/63490.html</wfw:comment><comments>http://www.cppblog.com/wolf/articles/63490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf/comments/commentRss/63490.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf/services/trackbacks/63490.html</trackback:ping><description><![CDATA[<div>
<div style="PADDING-RIGHT: 5px; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); PADDING-BOTTOM: 4px; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"></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;4</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Test<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_mX;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_mY;<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)&nbsp;<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_mX&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;n;<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test()<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;Test&nbsp;test;<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">&nbsp;&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">29</span>&nbsp;<span style="COLOR: #000000">}</span></div>
<br></div>
<div>&nbsp;&nbsp; &nbsp;执行一下这段代码，打印出了两个不同的对象地址，因为不带参数的构造函数实现里去调用带参数的构造函数时，并没有完成对象内部的函数调用，而是优先选择了通过带参数构造函数又构造出了一个新的对象。</div>
<div>所以在实际应用中，我们应该：</div>
<div>1. 我们要尽量避免构造函数间的调用；</div>
<div>2. 有人习惯在默认构造里对成员进行初始化，带参构造里进行赋值或更为复杂的处理，但实际各个构造函数的关系应该并列，我们应该在每个构造函数里都做成员初始化的操作，或者把成员初始化和每个构造函数要进行的同样的操作封装为一个类的私有成员函数，在每个构造函数里调用该成员函数；</div>
<div>3. 如果实在避免不了构造函数之间的调用，那就只能用必杀了，采用new的方式，即上面的代码20行改为<span style="FONT-SIZE: 13px; COLOR: rgb(57,57,57); LINE-HEIGHT: 21px; FONT-FAMILY: verdana"><span style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(0,0,255); PADDING-TOP: 0px" twffan="done">new</span><span style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(0,0,0); PADDING-TOP: 0px" twffan="done">&nbsp;(</span><span style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(0,0,255); PADDING-TOP: 0px" twffan="done">this</span><span style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(0,0,0); PADDING-TOP: 0px" twffan="done">)Test(</span><span style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(0,0,0); PADDING-TOP: 0px" twffan="done">0</span><span style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(0,0,0); PADDING-TOP: 0px" twffan="done">)，使<span style="FONT-SIZE: 14px; COLOR: rgb(57,57,57)">构造函数在已经分配好的内存上执行，而不是重新分配新的内存<span style="FONT-SIZE: 13px; COLOR: rgb(0,0,0)">;</span></span></span></span></div>
<div><span style="FONT-SIZE: 13px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana"><br></span></div>
<img src ="http://www.cppblog.com/wolf/aggbug/63490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf/" target="_blank">老狼</a> 2008-10-08 18:51 <a href="http://www.cppblog.com/wolf/articles/63490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>