﻿<?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++博客-n's 燃烧小宇宙-随笔分类-C++</title><link>http://www.cppblog.com/neverwinter/category/11741.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 20 Jun 2011 07:57:57 GMT</lastBuildDate><pubDate>Mon, 20 Jun 2011 07:57:57 GMT</pubDate><ttl>60</ttl><item><title>C++检查浮点类型能否转换为整型</title><link>http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Sun, 19 Jun 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/148964.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/148964.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/148964.html</trackback:ping><description><![CDATA[最近尝试用Cocoa做一个四则运算计算器来练手，类似于Windows cmd: calc的那种。<br /><br />毕竟这个东西算是我们项目组的入门练习，当年很多新人刚进来，老组长都会教他们用MFC/QT做个计算器来看看水平。由于各种原因，我当年倒是没有受到这种&#8220;礼遇&#8221;，等我真正开始做软件的时候，还是服务器端这样的纯C++代码做得比较多。但是不做不知道，一做才发现UI的逻辑还是挺复杂的，比如说，按&#8220;1&#8221;是追加到当前显示还是覆盖现有的显示呢，最后把逻辑弄清楚倒不是很麻烦，但要写出好看的代码还是有比较大的差距的。<br /><br />以上都是前言，好像比较长&#8230;&#8230;<br /><br />要说的是，在这个过程中发现的问题，计算结果是浮点数，要怎么判断其是否能无损地转换成整数，从而消除小数点后的一段无用的&#8220;0&#8221;，以更好地显示。直接上代码：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;FloatType</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">{<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; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_OFFSET&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">23</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_LEN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; "><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; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;uint32_t&nbsp;match_uint_type;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">};<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; ">template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">&nbsp;{<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_OFFSET&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">52</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPO_LEN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">11</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;uint64_t&nbsp;match_uint_type;<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">};<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; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;FloatType</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;float_to_int<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;_floattype_meta</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">FloatType</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;_meta;<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()&nbsp;(&nbsp;FloatType&nbsp;f,&nbsp;FloatType&nbsp;precision&nbsp;)<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;_meta::match_uint_type&nbsp;EXPO_MASK&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000; ">~</span><span style="color: #000000; ">((</span><span style="color: #000000; ">~</span><span style="color: #000000; ">(_meta::match_uint_type)</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;_meta::EXPO_LEN&nbsp;))&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;_meta::EXPO_OFFSET;<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_meta::match_uint_type</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(_meta::match_uint_type</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">f;<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;expo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pf)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;EXPO_MASK)&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000;">&nbsp;_meta::EXPO_OFFSET;<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;uint32_t&nbsp;EXPO_FIRSTBIT_MASK&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(_meta::EXPO_LEN</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;uint32_t&nbsp;EXPO_BOUND&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;EXPO_FIRSTBIT_MASK&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; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;expo&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;EXPO_BOUND&nbsp;)<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;to_right_move&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;expo&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;EXPO_BOUND;<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;to_right_move&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;_meta::EXPO_OFFSET&nbsp;)<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;cmp_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;_meta::EXPO_OFFSET&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;to_right_move;<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_meta::match_uint_type&nbsp;mask&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">(</span><span style="color: #000000; ">~</span><span style="color: #000000; ">((_meta::match_uint_type)</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;cmp_len);<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pf</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">mask)&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(&nbsp;f&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;precision&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;f&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">precision&nbsp;)&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">};</span></div><br />我的方法是通过浮点型的结构来进行判断。<br /><br />浮点类型一般结构如下：<br />|+/-|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exponent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />对于float，指数部分为8字节，尾数部分为23字节。<br /><div>对于double，指数部分为11字节，尾数部分为52字节。<br />其中指数部分是采用偏移方式的，比如float的指数部分为130，偏移值为127，即实际指数为130-127。<br />更详细的请参考<a target="_blank" href="http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html">这里</a>。</div><br />判断方法是，计算指数的值，根据偏移判断小数点后的尾数，想得比较简单，汗！<br />引入参数精度是为了判断值小于1时达到某个阈值的时候可以将后面的小数略去。<br /><br />Honestly，其实这个应该可以用sprintf，然后判断小数点后的&#8220;0&#8221;来实现的，似乎更加简单方便。<br />但是我觉得，作为一个&#8220;码农&#8221;，重造轮子也是一种趣味嘛！<img src ="http://www.cppblog.com/neverwinter/aggbug/148964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2011-06-19 16:06 <a href="http://www.cppblog.com/neverwinter/archive/2011/06/19/148964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Archlinux编译ACE时出的问题</title><link>http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Sat, 15 Jan 2011 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/138574.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/138574.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/138574.html</trackback:ping><description><![CDATA[官方有个比较精简的编译安装指南，见<a  href="http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/ACE-INSTALL.html">这里</a>。但是对于我所碰到的问题没有说明<br><br>提示链接时SSL的符号没有找到，但我是装好了openssl的，也特意找了一下，都安装在/usr/下<br><br>然后翻看了一下build/examples/IPC_SAP/SSL_SAP/下的Makefile，找到&#8220;LIBS = -lrt -ldl&#8221;，没有指明openssl库的链接<br><br>遂加上！～<br><br>LIBS = -lrt -ldl -lssl<br><br>编译之！～<br><br>build/test/SSL的问题同解。<br><br>不知道其他Linux发行版有没有这样的问题，还是我的配置有问题，但总算最终编译完了。<br><br><img src ="http://www.cppblog.com/neverwinter/aggbug/138574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2011-01-15 17:08 <a href="http://www.cppblog.com/neverwinter/archive/2011/01/15/138574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>new/delete operator笔记</title><link>http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 19 Jul 2010 10:21:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/120793.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/120793.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/120793.html</trackback:ping><description><![CDATA[1.new操作符可以带多参数<br>2.没有对应的operator delete会出现warning（vs2008）<br>3.operator new/delete是类成员的情况下，用自定义的operator new创建、调用构造函数，会自动调对应的operator delete来析构<br>4.delete操作符可以带多参数，要使用自定义的operator new只能显式调用<br>5.自定义的operator delete不会自动析构对象<br><br><img src ="http://www.cppblog.com/neverwinter/aggbug/120793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2010-07-19 18:21 <a href="http://www.cppblog.com/neverwinter/archive/2010/07/19/120793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于vs2008 SP1中CMFCToolBar的一些事儿</title><link>http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Thu, 20 May 2010 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/115984.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/115984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/115984.html</trackback:ping><description><![CDATA[话说昨天解决了MFC跨线程操作控件的问题，我满以为今天可以free一回，玩玩Linux、学学Vim、再准备一下毕业论文的事情，但还是有事情要做，然后又是&#8220;被&#8221;MFC郁闷了一天。<br><br>先介绍一下总体的情况。我们项目客户端的开发环境是VS2008+SP1，用的是MFC类库，里面居然用到了CMFCToolBar、CMFCMenuBar以及Appearance变化等的SPI新特性。说&#8220;居然&#8221;是因为这些东西不是项目必要的，当时可能也以为只是名字变了用法没变，估计在工程创建的时候根本就没有考虑这些，直接按着单文档工程默认配置，next、next直接创建完的，囧！当时做的时候也只是当作测试Demo来用，也没太在意，毕竟我们项目的重点在服务器而非这个MFC客户端。<br><br>后来由于项目原因，甲方要求我们把这个客户端尽快修改成一个可以发布版本。不改不知道，一改吓一跳，当准备动手修改工具栏时才发现与以前惯的CToolBar真实差距甚大。CToolBar可以用CImageList把自定义的BMP图片放到工具栏的按钮，详细可看<a href="http://www.vckbase.com/document/viewdoc/?id=241">这里</a>，CMFCToolBar根本就不是这样的一个玩法。直接放一个CToolBar上来，在DockControlBar()的时候会出现断言错误（缺少DockBar，貌似是这个名字，汗！）。定位代码到MainFrm的EnableDocking()，现在的MainFrm的继承关系是CMainFrm-&gt;CFrameWndEx-&gt;CFrameWnd，而以前是CMainFrm-&gt;CFrameWnd，CFrameWndEx::EnableDocking()是为DockPane()服务的，而DockControlBar()需要的DockBar并不会被初始化。调用基类的CFrameWnd::EnableDocking()后再DockControlBar()不会出现断言，但是那个工具栏没有显示。而且现在新特性下在工具栏位置能够按出右键菜单，但右键菜单中根本不可能有关于该CToolBar的信息，乍看起来很不和谐~<br><br>最后，求助本地MSDN无果，貌似SP1没有包含对MSDN文档的更新；求助MSDN官网，那个真是&#8220;言简意赅&#8221;。只能说，MS你这次真的&#8220;亮&#8221;了！<br><br>以下为google + vs2008 sp1 sample + 看代码的成果：<br>
<ul>
    <li>创建默认ToolBar外的第二个ToolBar</li>
</ul>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"></span><span style="color: #008080;">1</span> //默认工具栏<br><span style="color: #008080;">2</span> m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, <br><span style="color: #008080;">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);<span style="color: #000000;"><br></span><span style="color: #008080;">4</span> <span style="color: #000000;">//自定义工具栏<br></span><span style="color: #008080;">5</span> <span style="color: #000000;">m_mybar.CreateEx(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;TBSTYLE_FLAT, <br></span><span style="color: #008080;">6</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_CHILD&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;WS_VISIBLE&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOP&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_GRIPPER&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOOLTIPS&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_FLYBY&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_SIZE_DYNAMIC, <br></span><span style="color: #008080;">7</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">),&nbsp;<span style="color: red;">ID_MYBAR</span>);</span></div>
<br>注意，Wizard生成的工具栏Create时没有带ID，但第二个工具栏Create时最好要带ID。加了ID之后，在工具栏右键菜单才会出现第二个工具栏的CheckBox。否则，不良后果有：1、右键菜单没有该工具栏Checkbox；2、把默认工具栏和该工具栏拖出来（浮动），可以看到名字都是一样的（英文版为Standard）；3、后面要提到的UserImage不能作为按钮图标显示。<br><br>
<ul>
    <li>加载工具栏资源</li>
</ul>
我们先来看看CMFCToolBar加载工具栏的函数原型：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;BOOL&nbsp;LoadToolBar(UINT&nbsp;uiResID,&nbsp;UINT&nbsp;uiColdResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;UINT&nbsp;uiMenuResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;BOOL&nbsp;bLocked&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FALSE,<br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uiDisabledResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;UINT&nbsp;uiMenuDisabledResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;&nbsp;UINT&nbsp;uiHotResID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);</span></div>
可以看出，uiResID代表要加载的工具栏资源，理论上只需要这一个参数就能完成工具栏的加载。但是VS的Toolbar Editor只能编辑4bit的工具栏图标，以前CToolBar是用CImagList来加载更多bits的图标的，现在应该怎么做呢？多亏了Explore sample的例子，我发现后面的几个UINT参数就是BMP的资源，最主要的是最后一个uiHotResID，即便其他用默认值，这项赋BMP ID就能按预期的图标显示。Cold、Disable表示的是不同状态下的图标样式，带Menu的是Menu有关的图标，具体可看SP1 Feature的sample。<br>我的Demo里自定义工具栏的总创建过程：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;"> !</span><span style="color: #000000;">m_mybar.CreateEx(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;TBSTYLE_FLAT, <br></span><span style="color: #008080;">2</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;&nbsp;&nbsp;&nbsp;&nbsp; WS_CHILD&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;WS_VISIBLE&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOP&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_GRIPPER&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_TOOLTIPS&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_FLYBY&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;CBRS_SIZE_DYNAMIC, <br></span><span style="color: #008080;">3</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;&nbsp;&nbsp;&nbsp;&nbsp; CRect(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">),&nbsp;ID_MYBAR)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;"><br></span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">!</span><span style="color: #000000;">m_mybar.LoadToolBar(&nbsp;IDR_TOOLBAR1,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;FALSE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;theApp.m_bHiColorIcons</span><span style="color: #000000;">?</span><span style="color: #000000;">IDB_BITMAP1:</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)&nbsp;)<br></span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; {<br></span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE0(</span><span style="color: #000000;">"</span><span style="color: #000000;">Failed&nbsp;to&nbsp;create&nbsp;toolbar\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;fail&nbsp;to&nbsp;create</span><span style="color: #008000;"><br></span><span style="color: #008080;">8</span> <span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; m_mybar.SetWindowText(_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">abc</span><span style="color: #000000;">"</span><span style="color: #000000;">));</span></div>
最后的SetWindowText()设置工具栏的名称。<br>CMFCToolBar有LoadBitmap的方法，但是测试发现，用LoadToolBar只加载工具栏资源，再用LoadBitmap加载BMP资源，虽然返回值是TRUE，但显示图标为空白，没有实际效果。<br><br>
<ul>
    <li>工具栏停靠</li>
</ul>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">1 &nbsp; //</span><span style="color: #008000;">&nbsp;TODO:&nbsp;Delete&nbsp;these&nbsp;five&nbsp;lines&nbsp;if&nbsp;you&nbsp;don't&nbsp;want&nbsp;the&nbsp;toolbar&nbsp;and&nbsp;menubar&nbsp;to&nbsp;be&nbsp;dockable</span><span style="color: #008000;"><br></span><span style="color: #008080;">2</span><span style="color: #000000;">&nbsp;&nbsp; m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">3</span><span style="color: #000000;">&nbsp;&nbsp; m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">4</span><span style="color: #000000;">&nbsp;&nbsp; <span style="color: red;">m_mybar.EnableDocking(CBRS_ALIGN_ANY);</span><br></span><span style="color: #008080;">5</span><span style="color: #000000;">&nbsp;&nbsp; EnableDocking(CBRS_ALIGN_ANY);<br></span><span style="color: #008080;">6</span><span style="color: #000000;">&nbsp;&nbsp; DockPane(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m_wndMenuBar);<br></span><span style="color: #008080;">7</span><span style="color: #000000;">&nbsp;&nbsp; DockPane(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m_wndToolBar);<br></span><span style="color: #008080;">8</span><span style="color: #000000;">&nbsp;&nbsp; <span style="color: red;">DockPane(</span></span><span style="color: red;">&amp;m_mybar);</span></div>
与默认工具栏无异。<br><br>
<ul>
    <li>用户自定义图标</li>
</ul>
CMFCToolBar可以让用户自定义工具栏图标，使用静态成员函数SetUserImages()将一个CMFCToolBarImages对象设置进去，由所有CMFCToolBar对象共享。Wizard自动生成代码中有这样的例子：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(CMFCToolBar::GetUserImages()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;load&nbsp;user-defined&nbsp;toolbar&nbsp;images</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(m_UserImages.Load(_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">.\\UserImages.bmp</span><span style="color: #000000;">"</span><span style="color: #000000;">)))<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_UserImages.SetImageSize(CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">),&nbsp;FALSE);<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMFCToolBar::SetSizes(CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">),&nbsp;CSize(</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">));<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMFCToolBar::SetUserImages(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m_UserImages);<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
这个例子加载了工程路径下的一个BMP，其他方法可以查看MSDN，与CImageList有点点类似。<br>使用CMFCToolBar::ReplaceButton()可以替换已有的工具栏按钮，以下是我的Demo中的代码：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span> &nbsp; &nbsp; <span style="color: #000000;">m_mybar.ReplaceButton(&nbsp;ID_QTLOGO,&nbsp;CMFCToolBarButton(ID_QTLOGO,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;TRUE)&nbsp;);</span></div>
第一个参数ID_QTLOGO为自定义工具栏上的一个按钮，后面是一个<span style="color: #000000;">CMFCToolBarButton的临时对象。</span><span style="color: #000000;">CMFCToolBarButton构造函数第一个参数为替换</span>后的ID，第三个参数为名称，第二个参数为图标的索引(zero-based)，第四个参数为m_bUserButton，指明第二个参数是索引工具栏已加载图标(LoadToolBar或LoadBitmap)还是用户自定义图标（SetuserImages），TRUE指用户自定义图标。这里的结果是将ID_QTLOGO上的图标替换为<span style="color: #000000;">UserImages.bmp</span>上的第一个图标。<br><br><span style="color: #000000;">GetCmdMgr()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCmdImage()</span>可以根据工具栏上图标的ID获取出已加载图标的索引值：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000;">m_mybar.ReplaceButton(&nbsp;ID_QTLOGO,&nbsp;CMFCToolBarButton(ID_QTLOGO,&nbsp;GetCmdMgr()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetCmdImage(ID_PLUS),&nbsp;_T(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">))&nbsp;);</span></div>
这里将工具栏上ID_QTLOGO的图标替换为ID_PLUS按钮对应的图标。<br><br>特别地，如果在你将这些工具栏改来改去但显示结果却没有改变的时候，你可以尝试删除 <span style="color: red;">HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\$(你的程序名)</span> 这个键值，当你重启程序后工具栏应该会按你的预想变化的。这是我在查资料时看到的，当时没注意但后来发现挺有用的，出处没有记录下来。<br><br>最后，ReplaceButton还可以将按钮替换为其他控件。<br><br>
<ul>
    <li>其他...</li>
</ul>
我在自定义工具栏上做了一个有效响应，里面使用静态成员函数CMFCToolBar::ResetAllImages()将所有图标都清空了，此时会发现默认工具栏、自定义工具栏的图标都为空。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CMainFrame::OnQtLogo()<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;">&nbsp;&nbsp;&nbsp;&nbsp;CMFCToolBar::ResetAllImages();<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;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES,&nbsp;theApp.m_bHiColorIcons&nbsp;?&nbsp;IDB_MENU_IMAGES_24&nbsp;:&nbsp;0);</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar.LoadBitmap(IDB_BITMAP1);<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_mybar.LoadBitmap(IDR_MAINFRAME_256);<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar.RedrawWindow();<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_mybar.RedrawWindow();<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">}</span></div>
更奇妙的是，后面我对两个工具栏重新加载了BMP，而且加载的BMP资源是反了的，此时默认工具栏上出现了原来自定义工具栏的4个图标，余下部分及自定义工具栏则为原来默认工具栏图标。可以想象，RestAllImages只是将图标资源都释放了，工具栏资源依然健在，重新加载BMP的时候，工具栏图标就像一个个顺序排好的空间，加载进来的BMP图标会出现从前往后补位的现象。<br>注意代码中，默认工具栏图标重新加载时使用的资源是IDR_MAINFRAME_256，是默认的工具栏资源。也就是说，这里用LoadBitmap加载工具栏资源也是有效果的。这样应该可以说明工具栏在创建时LoadToolBar、LoadBitmap分别成功地加载了工具栏、BMP资源，实际上是加载了两套图标资源，这两者是顺序而非重合的，所以只显示原来的工具栏资源。要想指定两者的重合关系，只有在LoadToolBar的时候同时传入工具栏资源及BMP资源的ID。<br><br><a href="http://www.cppblog.com/Files/neverwinter/testtree.rar">Demo下载</a><br><br>————————————————————————————————————————————————————————————————<br>好吧，终于写完了！写得很仓促，不足的地方也很多，欢迎指教！<br>    <img src ="http://www.cppblog.com/neverwinter/aggbug/115984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2010-05-20 23:53 <a href="http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近几天被MFC折腾~</title><link>http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Wed, 19 May 2010 15:22:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/115853.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/115853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/115853.html</trackback:ping><description><![CDATA[备注：Rimi是我们用的一个分布式机制。<br><br>在进行设备树（也就是一个CTreeCtrl控件）更新修改的时候，遇到了一个比较bug的问题。<br><br>为了提供更好的用户体验，甲方希望设备树更新之后滚动条位置能够保持与更新前一致。设备树的更新过程是这样的：更新消息来自Rimi的通知机制，类似于函数回调，客户端在收到消息之后调用Rimi的对象方法来获取新的设备树信息，然后更新树。乍看之下，要完成这个修改好像很简单，只要更新前先记录滚动条的滚动位置，更新后还原位置，如果更新后滚动条滚动范围变化了还要微调一下位置，逻辑上来讲就这么几个步骤。<br><br>我一开始也是按照这样的思路，GetScrollPos()获取当前滚动条的滚动位置，然后更新树（先删除所有节点再逐个添加，其他省略...），GetScrollRange()获得新的滚动范围，最后SetScrollPos()将旧的位置与滚动范围最大值中最小的一个设回去（这里用到的ScrollBar是CTreeCtrl自动产生的，注意不是两个控件，这里调用的函数都是CTreeCtrl的方法）。但实际效果是，树更新后滚动条滚到准确的位置，但树的视图到了最顶，点击一下滚动条的那个方块才能回到之前的位置。也就是说，滚动位置的更新与树的视图分离了。<br><br>之后，我一直以为是我控件的方法用错了，对着MSDN和CSDN纠结了很久。最后忍无可忍，自己写了个测试Demo，里面就一Dialog，一CTreeCTrl，树上随便加了些东西，然后又一按键，按键后会重新刷新树，再滚动到原来的位置，结果居然是对的，视图跟着滚动条的位置变化了。为了更好的模拟设备树节点增删的效果，我在按键响应上又作了处理，按一下重刷树的时候会隐藏几个节点，再按一下这些节点显示出来，滚动位置按照客户端里面的一个处理方法，结果居然也是正确的。问题变得玄乎了！<br><br>无意间发现客户端里面有个手动刷新设备树的快捷键，估计是当年pb做调试的时候留下来的。快捷键的响应直接调用更新树的函数，重刷后的显示出人意料地是对的。比较一下两种更新方式的过程：<br><br>Rimi：&nbsp;&nbsp; 通知到来—&gt;更新树（Rimi回调函数，Rimi自己维护了一个线程池，远程调用在被调用端的发起者都是Rimi自己的线程）<br>快捷键： 按键响应—&gt;更新树（MFC消息处理函数）<br><br>更新树所用到的是同一个函数，但调用者却是不同的。因为Rimi用了boost::function，那我也在按键响应的时候对要调的函数用function来包装一下，造成两者在调用栈上调用的函数、顺序大部分是一致的，只有最底层不同，一边是Rimi，一边是MFC消息传递。<br><br>后来jianhao说，以前在Rimi的回调函数里面调Rimi对象的方法出过问题，然后我又顺道回忆起之前zxb在Rimi函数（还是对象方法）里面调system()也有问题。<br><br>难道说Rimi线程就是&#8220;万恶之源&#8221;？好吧，我把更新代码移到另外一个线程里面，Rimi回调的时候唤醒更新线程，更新后视图还是不能跟着滚动位置变；将快捷键的响应也修改一下，自己不作更新，也是唤醒更新线程，这个方法也变得不灵了，囧！这可以说明问题跟Rimi线程无关。<br><br>难道说线程调用才是&#8220;万恶之源&#8221;？把之前做的那个Demo小改了一把，线程做刷新，按键响应只唤醒更新线程，果然不灵了！上网google了一把，关键字&#8220;mfc 线程 操作控件&#8221;，首先映入眼帘的是《MFC中跨线程操作控件会不会出现像C#中的异常问题?》。这时候我也不关心这个帖子的内容了，线程操作控件有异常是吧，那就不用线程做咯！这时候我才回想起WIN32里面有自定义消息这玩意，MFC里面给定一个消息ID，ON_MESSAGE绑定一个处理函数，PostMessage或SendMessage来发消息，然后由WIN32自己的消息循环来调用处理函数，这样应该是可以保证用非Rimi线程来更新设备树的。再一次把Demo小改了一把，按键响应Post一个自定义消息，消息处理函数做刷新，结果是对的；再改，按键响应唤醒线程，线程里面Post自定义消息，结果也是对的。<br><br>原以为是控件使用问题，又以为是Rimi不兼容问题，最后实质为MFC跨线程使用控件的问题。其实我也不清楚这是不是真正的问题，毕竟我MFC既不懂又用得少。That's all!<br><br>最后附上我的测试代码<br><a  href="http://www.cppblog.com/Files/neverwinter/testtree.rar">http://www.cppblog.com/Files/neverwinter/testtree.rar</a><br> <img src ="http://www.cppblog.com/neverwinter/aggbug/115853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2010-05-19 23:22 <a href="http://www.cppblog.com/neverwinter/archive/2010/05/19/115853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象自杀</title><link>http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 26 Oct 2009 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/99521.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/99521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/99521.html</trackback:ping><description><![CDATA[最近做项目写代码遇到了对象自杀的问题。<br><br>第一个是自己设计的，对象持有定时器，自己维护生命周期。<br><br>第二个是无意中遇到的，由于采用boost的线程库，将成员函数变为线程用，最后在一堆调用之后居然把自己杀掉了。<br><br>很不幸的是，在过程中都遇到了相同的问题——堆栈挂掉了。<br><br>然后一轮定位，居然都是boost mutex的问题，scoped_lock很容易让人放松警惕。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;XXX(<img src="http://www.cppblog.com/Images/dot.gif">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;boost::recuisive_mutex::scoped_lock&nbsp;lk(m_mutex);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;YYYY();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;YYY(<img src="http://www.cppblog.com/Images/dot.gif">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;p;// 释放XXX所在对象<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br>}</span></div>
<br>作为类成员的mutex没有被解锁，然后所在的类就被释放了，这就造成了堆栈挂掉。<br><br>对象自杀显然不是一种很好的风格，还是尽量避免吧！<br><br> <img src ="http://www.cppblog.com/neverwinter/aggbug/99521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-10-26 21:29 <a href="http://www.cppblog.com/neverwinter/archive/2009/10/26/99521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fstream改写文件</title><link>http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 14 Sep 2009 06:40:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/96125.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/96125.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/96125.html</trackback:ping><description><![CDATA[项目中有这样的需求：<br>1.给一个一定大小的空文件改写内容；<br>2.不能改变该空文件的大小。<br><br>一开始是用ofstream做的，但是每次一打开文件，原来的空文件的大小就改变了。之后用app方式打开，但是每次的新数据都是追加到文件尾部，seekp无论如何不能到达实际文件的首部，这样文件大小就变了，不符合需求2。<br><br>后来发现用fstream，采用in | out的方式来打开，终于可以安全地改写文件了。<br><br> <img src ="http://www.cppblog.com/neverwinter/aggbug/96125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-09-14 14:40 <a href="http://www.cppblog.com/neverwinter/archive/2009/09/14/96125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组引用作函数模板的思考</title><link>http://www.cppblog.com/neverwinter/archive/2009/09/14/96107.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Mon, 14 Sep 2009 04:26:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/09/14/96107.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/96107.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/09/14/96107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/96107.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/96107.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><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;"><br></span><span style="color: #008080;">&nbsp;2</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;3</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RefAsParam(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">aRR)[</span><span style="color: #000000;">5</span><span style="color: #000000;">])<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;aRR[</span><span style="color: #000000;">3</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;7</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size_t&nbsp;SZ&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RefAsParamT(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">aRR)[SZ])<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;aRR[</span><span style="color: #000000;">0</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;">13</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main()<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;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">};<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;RefAsParam(&nbsp;a&nbsp;);<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;RefAsParamT(&nbsp;a&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;">&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">}</span></div>
<br>这个是上次在某blog友回帖时有感写的一个例子程序。<br><br>现在把目光放在<span style="color: #000000;">RefAsParamT函数，采用非类型模板的方式</span>使数组引用作为入参，乍看好像很爽，不需要在函数定义时指定数组的大小，比非模板方式的<span style="color: #000000;">RefAsParam</span>有极大的通用性。<br><br>但是，从模板生成的角度来看，对于不同的SZ就会产生不同的<span style="color: #000000;">RefAsParamT&lt;SZ&gt;函数，效率上说不过去，虽说这些代码是编译器代替人手写的。<br><br>再从数组引用作为入参的角度看，个人认为数组引用左入参的意义不大，特别是对于动态分配（new）的数组，这两个函数都无效。<br><br>最后，STL中先闭后开的方式来指定数组范围，这样的通用性和效率都比较好。<br><br>以上，个人愚见！<br><br></span> <img src ="http://www.cppblog.com/neverwinter/aggbug/96107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-09-14 12:26 <a href="http://www.cppblog.com/neverwinter/archive/2009/09/14/96107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ptime转换问题</title><link>http://www.cppblog.com/neverwinter/archive/2009/09/10/95806.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Thu, 10 Sep 2009 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/09/10/95806.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/95806.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/09/10/95806.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/95806.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/95806.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><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;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">date_time</span><span style="color: #000000;">/</span><span style="color: #000000;">posix_time</span><span style="color: #000000;">/</span><span style="color: #000000;">posix_time.hpp</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">date_time</span><span style="color: #000000;">/</span><span style="color: #000000;">gregorian</span><span style="color: #000000;">/</span><span style="color: #000000;">gregorian.hpp</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</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;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdint.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</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;">&nbsp;7</span>&nbsp;<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;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;boost::posix_time;<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;boost::gregorian;<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;ptime&nbsp;ptNow(&nbsp;second_clock::local_time()&nbsp;);<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;to_simple_string(&nbsp;ptNow&nbsp;)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;tm&nbsp;tm1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;to_tm(&nbsp;ptNow&nbsp;);<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;tt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mktime(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">tm1&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;tm</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;tm2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;localtime(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">tt&nbsp;);<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ptime&nbsp;ptt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;from_time_t(&nbsp;tt&nbsp;);<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ptime&nbsp;pttm&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ptime_from_tm(&nbsp;tm1&nbsp;);<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;to_simple_string(&nbsp;ptt&nbsp;)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;to_simple_string(&nbsp;pttm&nbsp;)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<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;">&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;">24</span>&nbsp;<span style="color: #000000;">}</span></div>
<br>输出结果：<br>2009-Sep-10 15:24:10<br>2009-Sep-10 07:24:10<br>2009-Sep-10 15:24:10<br><br>第一个为ptime获得的当前时间的输出。<br>第三个为ptime转为tm，再tm转成ptime的输出<br>第二个为那个tm转成time_t，time_t再转回ptime的输出。<br><br>从结果看，第二个输出的时间很诡异上居然差了8个小时，难道是UTC时间？但boost doc那里没有这个说明，只是说用from_time_t可以将time_t转成ptime。程序中间将time_t用localtime转回tm作验证，结果是正确的。<br><br>诡异了&#8230;&#8230;<br><br><img src ="http://www.cppblog.com/neverwinter/aggbug/95806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-09-10 15:30 <a href="http://www.cppblog.com/neverwinter/archive/2009/09/10/95806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>拷贝构造函数与赋值操作符重载</title><link>http://www.cppblog.com/neverwinter/archive/2009/09/08/95586.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Tue, 08 Sep 2009 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/09/08/95586.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/95586.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/09/08/95586.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/95586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/95586.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><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;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">str&nbsp;)<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_szS&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;str;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;A&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">rhs&nbsp;)<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_szS&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rhs.m_szS;<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;A</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;A&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">rhs&nbsp;)<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;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">rhs&nbsp;)<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_szS&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rhs.m_szS;<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<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;&nbsp;&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;m_szS;<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">31</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;">32</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;带参数基本构造，非explicit</span><span style="color: #008000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a1(</span><span style="color: #000000;">"</span><span style="color: #000000;">SB</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;不能通过基本构造完成，实质上调用的是对a1的拷贝构造</span><span style="color: #008000;"><br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a1;<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;验证赋值操作符</span><span style="color: #008000;"><br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a3(</span><span style="color: #000000;">"</span><span style="color: #000000;">SC</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;a3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a1;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;here</span><span style="color: #008000;"><br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&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;">44</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;"></span></div>
<br>总结：<br>1.实例化一个对象的时候，如果用另一个已有对象对其进行赋值，实质上调用的是拷贝构造函数，如上述的a2。<br>2.对一个已实例化对象采用赋值操作符对其进行赋值，调用的是赋值操作符重载的函数，如a3。<br><br>写得有点仓促，如有不同意见，欢迎拍板！<br><br><img src ="http://www.cppblog.com/neverwinter/aggbug/95586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-09-08 16:23 <a href="http://www.cppblog.com/neverwinter/archive/2009/09/08/95586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己写的一个智能指针</title><link>http://www.cppblog.com/neverwinter/archive/2009/08/21/94016.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Fri, 21 Aug 2009 05:00:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/08/21/94016.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/94016.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/08/21/94016.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/94016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/94016.html</trackback:ping><description><![CDATA[以下为智能指针的demo。<br>设计思路为：通过一个引用计数的指针在多个auto_ptr&lt;Type&gt;中共享Type对象。<br>&nbsp;<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;auto_ptr.h</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><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;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;myspace<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;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;auto_ptr<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">t;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;指针对象</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">use;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;引用计数，采用指针的方式是为了方便多个auto_ptr的共享</span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;一般构造函数</span><span style="color: #008000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr(T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">obj)<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;t(obj)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;接收指针</span><span style="color: #008000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;use(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;size_t(</span><span style="color: #000000;">1</span><span style="color: #000000;">))&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建引用计数</span><span style="color: #008000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;拷贝构造函数</span><span style="color: #008000;"><br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;auto_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ptr)<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;t(ptr.t)<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;use(ptr.use)<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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++*</span><span style="color: #000000;">(ptr.use);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;传递引用计数后，计数值+1</span><span style="color: #008000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">auto_ptr()<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;每次析构的时候，如果计数值为0则删除对象</span><span style="color: #008000;"><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&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;">use&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;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;t;<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;use;<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;-&gt;操作符重载</span><span style="color: #008000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">&nbsp;()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;t;<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;*操作符重载，返回指针对象的引用</span><span style="color: #008000;"><br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">t;<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">!&lt;&nbsp;流输出，采用了*操作符，所以不需要设为friend</span><span style="color: #008000;"><br></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Type</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">std::ostream</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(std::ostream&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">os,&nbsp;auto_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Type</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ptr)<br></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;os&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ptr;<br></span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;os;<br></span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">}</span><span style="color: #008000;">//</span><span style="color: #008000;">end&nbsp;of&nbsp;myspace<br></span><span style="color: #008080;">53</span>&nbsp;<span style="color: #008000;">&nbsp;<br></span><span style="color: #008080;">54</span>&nbsp;<span style="color: #008000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;main.cpp</span><span style="color: #008000;"><br></span><span style="color: #008080;">55</span>&nbsp;<span style="color: #008000;"></span><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;">56</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">auto_ptr.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br></span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;">#ifdef&nbsp;_DEBUG<br></span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;new&nbsp;new&nbsp;(_NORMAL_BLOCK,&nbsp;__FILE__,&nbsp;__LINE__)</span><span style="color: #000000;"><br></span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br></span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br></span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;myspace::auto_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;iptr(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">(</span><span style="color: #000000;">9</span><span style="color: #000000;">))&nbsp;;<br></span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;iptr&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">iptr;<br></span><span style="color: #008080;">65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;iptr&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">iptr)&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br></span><span style="color: #008080;">67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;iptr&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br></span><span style="color: #008080;">69</span>&nbsp;<span style="color: #000000;">&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;">70</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">71</span>&nbsp;<span style="color: #000000;">&nbsp;</span></div>
<br>从上面的Demo中，可以看到这个智能指针的缺点：<br>每次创建智能指针的时候，传入的指针是对外暴露的，采用new的方式作为入参才能保证安全的。如果这个new出来的对象（如上面的int（9））在别处被delete了，继续使用这个智能指针相当于使用一个野指针。这样的问题即便是boost的share_ptr也是会有的。<br><img src ="http://www.cppblog.com/neverwinter/aggbug/94016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-08-21 13:00 <a href="http://www.cppblog.com/neverwinter/archive/2009/08/21/94016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Member Initialization list（成员初始化表）</title><link>http://www.cppblog.com/neverwinter/archive/2009/08/19/93809.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Wed, 19 Aug 2009 04:26:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/08/19/93809.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/93809.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/08/19/93809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/93809.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/93809.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 这个是我们组的每日一例，主要目的是想通过老队员指导新队员，同时又可以巩固大家的cpp知识。我们组长说，项目做完之后这些东东可以整理出书了～<br>&nbsp;&nbsp;&nbsp; 这一份是我写的，所以就发布出来啦！～这个还算写得比较详细吧！<br>&nbsp;<br><br><span style="font-family: 黑体; color: #0010ff; font-size: 14pt; font-weight: bold;">Chapter One - 调用构造函数对成员变量进行构造、初始化</span><br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 在类构造的时候，对于类成员变量的构造貌似可以在构造函数中完成，那为什么还需要成员初始化表呢？<br>&nbsp;&nbsp;&nbsp; 我们来看看这样的情况：<br>&nbsp;
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;programme&nbsp;1&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Base<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Base(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val)<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;i(val)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这里为什么要放在成员初始化表呢？</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">i&nbsp;=&nbsp;val??</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">Base(){}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;UseBase<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;b;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UseBase(){}&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">没有用Base的构造函数</span><span style="color: #008000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">UseBase(){}<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;&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;">27</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;end&nbsp;of&nbsp;programme&nbsp;1&nbsp;</span><span style="color: #008000;">*/</span></div>
<br>&nbsp;&nbsp;&nbsp; 程序出现这样的错误：error C2512: 'Base' : no appropriate default constructor available，在UseBase中Base没有被合理地初始化。<br>&nbsp;<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;programme&nbsp;2&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><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: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;"></span><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;UseBase<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;&nbsp;&nbsp;Base&nbsp;b;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UseBase()&nbsp;:&nbsp;b(</span><span style="color: #000000;">0</span><span style="color: #000000;">){}&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">可以编译通过</span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">UseBase(){}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;end&nbsp;of&nbsp;programme&nbsp;2&nbsp;</span><span style="color: #008000;">*/</span></div>
<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 由此可以看出成员初始化列表的一个要点，调用构造函数对成员变量进行构造、初始化。对于内置成员变量(int、double等等，个人理解为C语言中就已经有的类型，详细信息参见Primer)而言没有明显的问题，但对于非内置成员变量而言，即便编程者没有在成员初始化表中显示调用构造函数，编译器也会隐式地调用默认构造函数。所谓&#8220;默认构造函数&#8221;就是指"$classname$(void)"这样的形式。上面的例子就是因为这个原因而编译失败的，Base没有提供默认构造函数。也就是说，需要特殊构造的类必须在成员初始化列表进行构造、初始化。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 而如果有默认构造函数，是否就可以在成员初始化表中置之不理呢？答案是否定的，这涉及到效率问题。（以下程序可以中的Base完全可以用string类型来取代，但为了方便调试方式查看，所以重新编写了Base。）<br>&nbsp;<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;programme&nbsp;3&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Base<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;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Base(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;i(</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;breakpoint&nbsp;1</span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;赋值操作符重载</span><span style="color: #008000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Base</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val&nbsp;)<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;val;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;breakpoint&nbsp;2</span><span style="color: #008000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">Base(){}<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<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;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;UseBase<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;b;<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UseBase()<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">:&nbsp;b(0)</span><span style="color: #008000;"><br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;breakpoint&nbsp;3</span><span style="color: #008000;"><br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">UseBase(){}<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">35</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;">36</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;UseBase&nbsp;ub;<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&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;">39</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;end&nbsp;of&nbsp;programme&nbsp;3&nbsp;</span><span style="color: #008000;">*/</span></div>
<br>&nbsp;&nbsp;&nbsp; breakpoint的顺序为1-3-2，这说明UseBase中的Base既进行了默认构造，之后又进行了赋值，原本可以通过一个构造函数完成的操作，现在分成了两个步骤，效率降低了。<br>&nbsp;<br><br><span style="font-family: 黑体; color: #0010ff; font-size: 14pt; font-weight: bold;">Chapter Two - 派生类的成员初始化表</span><br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 在派生类的成员初始化表中，可以调用基类的构造函数来初始化其基类成分。<br>&nbsp;<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;programme&nbsp;4&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</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;"><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;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Base<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Base(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val&nbsp;)<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;i(val)<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Base</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val&nbsp;)<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;val;<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&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;">Base(){}<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print()&nbsp;</span><span style="color: #0000ff;">const</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;">&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;">val:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<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;"><br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Derived&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Base<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Derived(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val&nbsp;)<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Base(val)<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{}<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">37</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;">38</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Derived&nbsp;d(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;d.print();<br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&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;">43</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;end&nbsp;of&nbsp;programme&nbsp;4&nbsp;</span><span style="color: #008000;">*/</span></div>
<br>&nbsp;&nbsp;&nbsp; 一个小错误，很多人可能会犯的：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;programme&nbsp;5&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Derived&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Base<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Derived(&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val&nbsp;)<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">:&nbsp;Base(val)</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Base(val);<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;end&nbsp;of&nbsp;programme&nbsp;5&nbsp;</span><span style="color: #008000;">*/</span></div>
&nbsp;<br>&nbsp;&nbsp;&nbsp; 在构造函数体内直接调用基类的构造函数，但这样是不能完成对基类成分的初始化的。这个语句的意义是创建一个临时的Base对象。<br>&nbsp;<br>&nbsp;<br><span style="font-family: 黑体; color: #0010ff; font-size: 14pt; font-weight: bold;">Chapter Three - 初始化const、引用成员</span><br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 利用成员初始化表能够初始化const、引用成员，这在构造函数体内是无法做到的。因为一般情况下，const、引用的对象在声明的时候就要同时将值或对象绑定到一起。<br>&nbsp;<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;programme&nbsp;6&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</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;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</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;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;dummy<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;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;ci;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;szStr;<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;dummy(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">sz)<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;ci(i)<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;szStr(sz)<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{}<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printi()<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&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;">const&nbsp;int:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;ci&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printsz()<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&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;">string&amp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;szStr&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<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;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setsz(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">sz)<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szStr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sz;<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">32</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;">33</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;_4ref(</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;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;dummy&nbsp;d(</span><span style="color: #000000;">10</span><span style="color: #000000;">,&nbsp;_4ref);<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;d.printi();<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;d.printsz();<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;d.setsz(&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">goodbye</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;);<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;d.printsz();<br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&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;">_4ref:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;_4ref&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&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;">44</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;end&nbsp;of&nbsp;programme&nbsp;6&nbsp;</span><span style="color: #008000;">*/</span></div>
<br>输出结果<br>const int: 10<br>string&amp;: hello<br><br>string&amp;: goodbye<br>_4ref: goodbye<br><img src ="http://www.cppblog.com/neverwinter/aggbug/93809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-08-19 12:26 <a href="http://www.cppblog.com/neverwinter/archive/2009/08/19/93809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个“过度设计”的四则运算器</title><link>http://www.cppblog.com/neverwinter/archive/2009/08/18/93741.html</link><dc:creator>nelson</dc:creator><author>nelson</author><pubDate>Tue, 18 Aug 2009 15:01:00 GMT</pubDate><guid>http://www.cppblog.com/neverwinter/archive/2009/08/18/93741.html</guid><wfw:comment>http://www.cppblog.com/neverwinter/comments/93741.html</wfw:comment><comments>http://www.cppblog.com/neverwinter/archive/2009/08/18/93741.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/neverwinter/comments/commentRss/93741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/neverwinter/services/trackbacks/93741.html</trackback:ping><description><![CDATA[看了Primer的TextQuery的例子，又动手copy了一遍，对于这样华丽的设计激动得久久不能自已。<br><br>前几天，按照这个例子，自己封装了一套四则运算表达式类，重现了一下这样的设计模式。<br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/neverwinter/expr.jpg" align="left" height="285" width="600"><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>然后，做了一个parser来解析表达式，不过做得很搓，stringstream对于括号的读取有问题&#8230;&#8230;不过主要功能已经基本实现了。<br><br>现上传代码：<br><a href="http://www.cppblog.com/Files/neverwinter/Expression.zip">http://www.cppblog.com/Files/neverwinter/Expression.zip</a><br><br>环境是vs2008 SP1，里面用到了boost的shared_ptr。<br><br>parser的设计实在太烂，如果有什么高见请指教一下！～<br><br>PS：看到别人用boost::spirit来做同样的表达式分析计算，居然80多行代码就完美实现了（还包括提示信息）。可见，boost的潜力是十分大的，以后一定要好好学习、挖掘一下。<br><br><img src ="http://www.cppblog.com/neverwinter/aggbug/93741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/neverwinter/" target="_blank">nelson</a> 2009-08-18 23:01 <a href="http://www.cppblog.com/neverwinter/archive/2009/08/18/93741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>