﻿<?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++博客-(define (cuigang) (coding))-随笔分类-C/C++</title><link>http://www.cppblog.com/cuigang/category/5805.html</link><description>(define (coding) (coding))
</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 19:57:43 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 19:57:43 GMT</pubDate><ttl>60</ttl><item><title>数组类型、函数类型到左值和右值的转换</title><link>http://www.cppblog.com/cuigang/archive/2008/04/07/46464.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 07 Apr 2008 14:50:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/04/07/46464.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/46464.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/04/07/46464.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/46464.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/46464.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、左值和右值<br><br>表达式的左值是它的地址，右值是该地址所存储的内容。比如下面代码：<br><br>x = x + 1;<br><br>这两个 x 有什么不同呢？&nbsp;&nbsp;<a href='http://www.cppblog.com/cuigang/archive/2008/04/07/46464.html'>阅读全文</a><img src ="http://www.cppblog.com/cuigang/aggbug/46464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-04-07 22:50 <a href="http://www.cppblog.com/cuigang/archive/2008/04/07/46464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对数组名取地址是什么？</title><link>http://www.cppblog.com/cuigang/archive/2008/04/04/46271.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Fri, 04 Apr 2008 12:06:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2008/04/04/46271.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/46271.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2008/04/04/46271.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/46271.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/46271.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这两天有人问以下有什么代码有什么不同？<br><br>1 int array[100];<br>2 <br>3 memset(array,  0, sizeof(array));<br>4 memset(&array, 0, sizeof(array));&nbsp;&nbsp;<a href='http://www.cppblog.com/cuigang/archive/2008/04/04/46271.html'>阅读全文</a><img src ="http://www.cppblog.com/cuigang/aggbug/46271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2008-04-04 20:06 <a href="http://www.cppblog.com/cuigang/archive/2008/04/04/46271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再论Singleton</title><link>http://www.cppblog.com/cuigang/archive/2007/12/20/39161.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Thu, 20 Dec 2007 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/20/39161.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/39161.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/20/39161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/39161.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/39161.html</trackback:ping><description><![CDATA[<div style="font-family: courier new;" class="Section1"><font size="1"><span style="font-size: 9pt;">记得以前大家讨论过</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">Singleton</span></font><font size="1"><span style="font-size: 9pt;">三种写法的优劣，今天我又发现了一个新问题，在这里和大家分享一下。下面是三种</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">Singleton</span></font><font size="1"><span style="font-size: 9pt;">的写法：</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></font>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="1"><span style="font-size: 9pt;">&nbsp;
<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: #008000;">//</span><span style="color: #008000;">&nbsp;1st</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Singleton{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Singleton&nbsp;inst;<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;Singleton</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;GetInst(){<br></span><span style="color: #008080;">&nbsp;6</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;inst;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<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;">Singleton&nbsp;Singleton::inst;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;2nd</span><span style="color: #008000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Singleton{<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Singleton</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;_inst;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Singleton</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;GetInst(){<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;">if</span><span style="color: #000000;">(_inst&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_inst&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Singleton;<br></span><span style="color: #008080;">17</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;">_inst;<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;">};<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;3rd</span><span style="color: #008000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Singleton{<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Singleton</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;GetInst(){<br></span><span style="color: #008080;">24</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;Singleton&nbsp;inst;<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;inst;<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;">}</span></div>
</span></font></p>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="1"><span style="font-size: 9pt;">我们已经知道方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">1</span></font><font size="1"><span style="font-size: 9pt;">没有多线程问题，但编译时分配内存。方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">2</span></font><font size="1"><span style="font-size: 9pt;">有多线程问题，在运行时分配内存。方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">3</span></font><font size="1"><span style="font-size: 9pt;">也有多线程问题，而且在编译时分配内存，但在运行时调用构造函数。（多线程问题的解决方法在此不再赘述。）</span></font><font size="1"><span style="font-size: 9pt;"><o:p></o:p><br><br>那么，我们可能就认为方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">1</span></font><font size="1"><span style="font-size: 9pt;">虽然在编译时分配内存，但我们不在乎这点内存，反正写出来是要用的，这点内存少不了，既避免了多线程，又避免了分配失败。就用它了！</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="1"><span style="font-size: 9pt;">不幸的是，方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">1</span></font><font size="1"><span style="font-size: 9pt;">也有它自身的问题。今天我在构造一个对象工厂时，期望通过全局变量，向工厂注册派生类的生成方法时，方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">1</span></font><font size="1"><span style="font-size: 9pt;">暴露了它的问题。比如我们在</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">Singleton</span></font><font size="1"><span style="font-size: 9pt;">中有一个方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">RegisterMethod(CallBack*)</span></font><font size="1"><span style="font-size: 9pt;">，那么我可能这样实现。</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="1"><span style="font-size: 9pt;" lang="EN-US">&nbsp;</span></font></p>
<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;">1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">以下代码是全局的，文件级作用域</span><span style="color: #008000;"><br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">{<br></span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CBase</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;CreateDeriveObj()<br></span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">6</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: #0000ff;">new</span><span style="color: #000000;">(CDerive);<br></span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;tmp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Singleton::GetInst().RegisterMethod(CreateDeriveObj);<br></span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">}</span><span style="color: #008000;">//</span><span style="color: #008000;">end&nbsp;of&nbsp;namespace</span></div>
&nbsp;<o:p></o:p>
<p>&nbsp;</p>
<font size="1"><span style="font-size: 9pt;" lang="EN-US"></span></font>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="1"><span style="font-size: 9pt;">结果发现在调用</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">RegisterMethod()</span></font><font size="1"><span style="font-size: 9pt;">时，</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">Singleton::inst </span></font><font size="1"><span style="font-size: 9pt;">还没有初始化（构造函数没有被调用）。究其原因是编译器虽然在编译时对其分配内存，但是构造函数是在运行时，在</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">Main()</span></font><font size="1"><span style="font-size: 9pt;">函数前调用。而对于全局变量，编译器是不保证初始化顺序的！而这个例子就是</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">tmp</span></font><font size="1"><span style="font-size: 9pt;">在构造时，</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US"> Singleton::inst </span></font><font size="1"><span style="font-size: 9pt;">还没有构造。</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="1"><span style="font-size: 9pt;">而这个问题的解决方法只有使用方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">2</span></font><font size="1"><span style="font-size: 9pt;">或者方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">3</span></font><font size="1"><span style="font-size: 9pt;">，考虑到我们不能在</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">Main</span></font><font size="1"><span style="font-size: 9pt;">函数前使用</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">new</span></font><font size="1"><span style="font-size: 9pt;">操作符，我用了方法</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US">3</span></font><font size="1"><span style="font-size: 9pt;">。又因为我有全局变量保证，就可以不考虑多线程问题了。</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="text-align: left;" align="left"><font size="1"><span style="font-size: 9pt;">要么是这个问题，要么是那个问题，你总要解决一个问题。</span></font><font size="1"><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="1"><span style="font-size: 9pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></font></p>
</div><img src ="http://www.cppblog.com/cuigang/aggbug/39161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-20 21:55 <a href="http://www.cppblog.com/cuigang/archive/2007/12/20/39161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>final 加强</title><link>http://www.cppblog.com/cuigang/archive/2007/12/17/38809.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 17 Dec 2007 13:37:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/17/38809.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/38809.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/17/38809.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/38809.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/38809.html</trackback:ping><description><![CDATA[<br>&nbsp;<br>在我的旧文中，曾经提到在 C++ 中实现 Java 的 final 功能，但每次都要写一个基类比较麻烦，今次用模板把它加强。<br>&nbsp;<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">template</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;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;final{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;T;<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">private</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;final(){};<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;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyTest&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;final</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MyTest</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyTest(){};<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">};</span></div>
<br>&nbsp;<br>这样以后就可以直接继承模板类 final&lt;T&gt;，而不用每次都写一个类。<br>&nbsp;<br>在这里顺便说一下，为什么一定要虚继承，假设我们有<br>&nbsp;<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: #008080;">1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;test&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;MyTest{};</span></div>
<br>&nbsp;<br>如果上面不是虚继承，那么&nbsp;final 类的构造函数由 MyTest 的构造函数负责调用，因为是友元类，则调用成功，无法阻止 test 实例化。而一旦声明为虚继承，MyTest 不再负责调用 final 的构造函数，而由 test 来调用，那么因为不是友元类，实例化将失败，编译出错，提示不能访问私有的构造函数。<br>&nbsp;<br> <img src ="http://www.cppblog.com/cuigang/aggbug/38809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-17 21:37 <a href="http://www.cppblog.com/cuigang/archive/2007/12/17/38809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对数据访问类型限制的一个方法(尝试)</title><link>http://www.cppblog.com/cuigang/archive/2007/12/17/38808.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 17 Dec 2007 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/17/38808.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/38808.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/17/38808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/38808.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/38808.html</trackback:ping><description><![CDATA[<br>&nbsp;<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TestBase{<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data;<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;write(){};<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;read(){};<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;<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test:</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TestBase{<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;client;<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;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">Test&nbsp;test;<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">TestBase&nbsp;test2;<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;<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;client{<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;dowith(){<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.write();<br></span><span style="color: #008080;">20</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: #008000;">//</span><span style="color: #008000;">test2.write();</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;&nbsp;&nbsp;&nbsp;&nbsp;};<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">-----------</span><span style="color: #008000;"><br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #008000;"></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;&nbsp;&nbsp;&nbsp;&nbsp;client&nbsp;c;<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.dowith();<br></span><span style="color: #008080;">28</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;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">}</span></div>
<br>这里将写方法声明为保护的，对外界不可访问。派生类Test的作用仅仅是将友元类进行声明。<br>&nbsp;<br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br>妙妙妙！<br>使用这个方法，就可以对类的私有函数进行单元测试了！！！！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JeansBer<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br> <img src ="http://www.cppblog.com/cuigang/aggbug/38808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-17 21:36 <a href="http://www.cppblog.com/cuigang/archive/2007/12/17/38808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>空对象模式</title><link>http://www.cppblog.com/cuigang/archive/2007/12/17/38804.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 17 Dec 2007 13:34:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/17/38804.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/38804.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/17/38804.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/38804.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/38804.html</trackback:ping><description><![CDATA[<span style="font-size: 8pt;"><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;"><span style="font-family: courier new;">Martin Flower在《重构》里提到空对象模式，对于从容器中查找失败需要返回引用时，可以使用，同时我觉的对于空指针调用也有一定作用，试举一例：</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<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;">&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;Mail{<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print()<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{std::cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello!</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">std::endl;};<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">(size_t);<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;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;NullMail{<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NullMail(){};<br></span><span style="color: #008080;">12</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;NullMail&nbsp;inst;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print(){<br></span><span style="color: #008080;">15</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;">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;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">error!&nbsp;You&nbsp;can't&nbsp;access&nbsp;a&nbsp;NULL&nbsp;object!</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&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;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;NullMail</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;&nbsp;GetInst(){</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;inst;};<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;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">NullMail&nbsp;NullMail::inst;<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;Mail::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">(size_t){<br></span><span style="color: #008080;">24</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;">&amp;</span><span style="color: #000000;">NullMail::GetInst();<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;<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">Mail</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;GetMailPtr(){<br></span><span style="color: #008080;">28</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;NULL;<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;">&nbsp;<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">Mail</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;GetMailRef(){<br></span><span style="color: #008080;">32</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;(Mail</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">)NullMail::GetInst();<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;<br></span><span style="color: #008080;">35</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;">36</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mail</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;ptr_Mail&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetMailPtr();<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mail</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;ref_Mail&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetMailRef();<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">ptr_Mail-&gt;print();</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;&nbsp;&nbsp;&nbsp;&nbsp;ref_Mail.print();</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;"><span style="font-family: courier new;">当我们返回一个空指针给调用者，如果他没有判断，那就会发生系统崩溃，而我们返回一个空对象的引用就可以避免这一点。</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;"><span style="font-family: courier new;">另外一个附加的有趣现象，你认为下面的调用会输出什么信息？</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<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: #000000;"><br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr_Mail&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Mail;<br></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr_Mail&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">print();<br></span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref_Mail.print();&nbsp;&nbsp;&nbsp;</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;"><span style="font-family: courier new;">正确的答案是：</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<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: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello!<br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello!</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;"><span style="font-family: courier new;">因为Mail的缺省构造函数将自己的vptr填给了NullMail单例。</span><br style="font-family: courier new;"><span style="font-family: courier new;">＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</span><br style="font-family: courier new;"><span style="font-family: courier new;">一个问题，是不是Mail的每个公共接口，NullMail都要去实现一下？&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －－th</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;"><span style="font-family: courier new;">//除非实在没有必要，的确应当实现一下所有的公有虚方法。cuigang，2007-11-08</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;"><span style="font-family: courier new;">＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</span><br style="font-family: courier new;"><span style="font-family: courier new;">&#8220;对于从容器中查找失败需要返回引用时&#8221;，下午刚刚碰到一个这样的问题。&nbsp;&nbsp;&nbsp;&nbsp; jb</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;</span><br style="font-family: courier new;">  </span><img src ="http://www.cppblog.com/cuigang/aggbug/38804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-17 21:34 <a href="http://www.cppblog.com/cuigang/archive/2007/12/17/38804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>雕虫小技几则</title><link>http://www.cppblog.com/cuigang/archive/2007/12/17/38801.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 17 Dec 2007 13:31:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/17/38801.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/38801.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/17/38801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/38801.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/38801.html</trackback:ping><description><![CDATA[<br>&nbsp;<br>昨天看了一下除颤的代码，发现里面类的框架里有一个NoCopy（类似名字）的类，将拷贝构造函数和赋值运算符声明为私有的，那么继承于这个类的派生类也不能被克隆，注释中强调要私有继承，其实如何继承都可以，只要派生类不在public部分重新定义拷贝构造函数和赋值运算符就可以，另外也不必单独写一个类，这个声明写到基类就可以了。<br>&nbsp;<br>看到这个我又想到一些类似的小技巧，比如单件模式，其实就是将缺省构造函数声明为私有，以限制实例化。例如还有：<br>&nbsp;<br>1、强制必须动态分配，可以将析构函数声明为私有，同时提供free方法（因为不能delete）。<br>&nbsp;<br>2、禁止动态分配，将new方法声明为私有。<br>&nbsp;<br>3、禁止继承，继承一个类（最好虚继承），这个类的构造函数是私有的，并且它的友元类是派生类。这个比较复杂，代码示例如下<br>&nbsp;<br>class final{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; friend class MyTest;<br>private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final(){};<br>};<br>class MyTest : public virtual final{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyTest(){};<br>};<br>&nbsp;<br>这样就实现了Java的Final功能。<br>&nbsp;<br> <img src ="http://www.cppblog.com/cuigang/aggbug/38801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-17 21:31 <a href="http://www.cppblog.com/cuigang/archive/2007/12/17/38801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个问题的讨论</title><link>http://www.cppblog.com/cuigang/archive/2007/12/17/38799.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 17 Dec 2007 13:30:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/17/38799.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/38799.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/17/38799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/38799.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/38799.html</trackback:ping><description><![CDATA[一个问题的讨论<br>&nbsp;<br>今天在QQ里跟大家讨论了一个问题，虽然没有结论，但是还是贴出来留个记号。<br>&nbsp;<br>崔刚(崔刚) 2007-10-25 16:18:55<br>如何通过基类指针调用派生类特有方法，前提是不允许强制转换指针类型？<br>例如有基类 class base{};<br>派生类<br>class derive:public base{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int A();<br>}<br>我得到了一个base* 类型的指针 derive_ptr，但它指向derive类型对象，我如何调用方法 derive::A(), 不可以<br>((derive*)derive_ptr)-&gt;A();<br>李奇兵(李奇兵) 2007-10-25 16:20:17<br>把方法A（）申明为虚的<br>陶华(陶华) 2007-10-25 16:20:52<br>除非基类有这个虚接口<br>李奇兵(李奇兵) 2007-10-25 16:20:55<br>把方法A（）申明为虚的，在Base定义一个。<br>向官文(向官文) 2007-10-25 16:21:16<br>用函数指针应该可以实现吧<br>陈道生(陈道生) 2007-10-25 16:22:46<br>没方法<br>崔刚(崔刚) 2007-10-25 16:22:27<br>呵呵，如果base类有几十个派生类，每个派生类都有不同的特有方法，那么在基类中就会存在几十个虚方法，而每个派生类只实现一个，其它全部不实现，<br>这样是不是不太好？？<br>李伟(监护）(李伟(监护）) 2007-10-25 16:23:25<br>如果是public的，基类应该声明吧<br>张建生(张建生) 2007-10-25 16:23:57<br>这样的话该函术确实不应该在基类里面定义<br>基类里面只定义共有的<br>靳波(靳波) 2007-10-25 16:23:47<br>这个问题的答案肯定很有技巧，但我认为这种技巧太花哨，不知道也没关系<br>陶华(陶华) 2007-10-25 16:24:49<br>崔刚，你那样定义是违反替换原则的<br>向官文(向官文) 2007-10-25 16:25:02<br>咱们的消息映射机制就是用基类的函数指针调派生类的成员函数<br>李伟(监护）(李伟(监护）) 2007-10-25 16:25:02<br>还是想知道。。<br>莫书健(莫书健) 2007-10-25 16:25:22<br>上面那段代码会不会运行是对的？<br>只是这样强制转换不是很符合编码规范<br>崔刚(崔刚) 2007-10-25 16:25:28<br>呵呵，不要怀疑我的问题的实用性<br>彭建军(彭建军) 2007-10-25 16:26:34<br>对于这个问题，C++的标准解决方法应该是dynamic_cast<br>靳波(靳波) 2007-10-25 16:26:15<br>cast也是类型转换<br>莫书健(莫书健) 2007-10-25 16:27:41<br>加不加dynamic_cast之类的，运行效果应该一样<br>彭建军(彭建军) 2007-10-25 16:29:18<br>是类型转换，但那是C++标准的转换方式。<br>向官文(向官文) 2007-10-25 16:30:45<br>dynamic_cast 据说会损失执行期效率<br>靳波(靳波) 2007-10-25 16:31:33<br>dynamic是在运行时进行转换，所以不是据说，是肯定会损失执行期效率。<br>靳波(靳波) 2007-10-25 16:36:22<br>#include "stdafx.h"<br>#include &lt;iostream&gt;<br>using namespace std;<br>class Base<br>{<br>};<br>class Derive : public Base<br>{<br>public:<br>&nbsp;int A(){cout&lt;&lt; "Derive::A()\n"; return 0;}<br>};<br>union Amazing<br>{<br>&nbsp;Base* pBase;<br>&nbsp;Derive* pDerive;<br>};<br><br>int _tmain(int argc, _TCHAR* argv[])<br>{<br>&nbsp;Base* derive_prt = new Derive;<br>&nbsp;Amazing trick;<br>&nbsp;trick.pBase = derive_prt;<br>&nbsp;trick.pDerive-&gt;A();<br>&nbsp;delete derive_prt;<br>&nbsp;return 0;<br>}<br>向官文(向官文) 2007-10-25 16:37:45<br>typedef void (base:: *BasefnPtr) ();<br>BasefnPtr fn_ptr = &amp;derive::A;<br>然后用基类的指针去调<br>(pBase-&gt;*fn_ptr)();<br>我看高端里消息响应函数就这样调<br>没理解错吧 ;)<br>崔刚(崔刚) 2007-10-25 16:39:09<br>同志们，跑题了<br>1、不能强制转换，标准的强制转换也不行。<br>2、不是把派生类指针转成基类指针，那样是没问题的。我说的是把基类指针转成派生类指针。<br>杨晓涛(杨晓涛) 2007-10-25 16:40:14<br>靳波的方法挺有创意的，呵呵<br>靳波(靳波) 2007-10-25 16:40:45<br>：）<br>莫书健(莫书健) 2007-10-25 16:41:37<br>jinbo的方法有什么优点？<br>崔刚(崔刚) 2007-10-25 16:41:46<br>靳波太搞笑了，这样写不可维护<br>靳波(靳波) 2007-10-25 16:41:41<br>这个方法太危险<br>崔刚(崔刚) 2007-10-25 16:42:13<br>变相的强制转换，不合格，0分<br>莫书健(莫书健) 2007-10-25 16:43:34<br>cuigang的需求估计没有解决方法<br>陶华(陶华) 2007-10-25 16:44:57<br>需求评审不通过<br>崔刚(崔刚) 2007-10-25 16:44:40<br>问题本身是没有解的，但是迂回的方法有，比如IoControl或者高端中ControlModule的方法就是一种，但是不是有其它更好的办法呢？<br>崔刚(崔刚) 2007-10-25 16:45:34<br>visitor 模式也提供了一种方法，但是太麻烦，本质上和 IoControl 没什么区别。<br>张进(张进) 2007-10-25 16:48:45<br>还有一种方法,把编译器作者拉出来打,狂打,直到他搞定为止!<br>陈道生(陈道生) 2007-10-25 16:48:57<br>有点像已经知道方法名和参数,如何调用实例对应的方法,在c++中无解,在其他语言大放异彩(java,c#),都是要具有元编程能力的语言才行.<br>崔刚(崔刚) 2007-10-25 16:48:26<br>我需要一种安全方便又易于维护的办法，不要急着回答<br>崔刚(崔刚) 2007-10-25 16:49:23<br>难道我们真的离不开强制转换？？<br>莫书健(莫书健) 2007-10-25 16:52:18<br>如果想调用派生类的方法，就要使用虚函数，<br>设计基类是要充分抽象，尽量想到种种情况<br>向官文(向官文) 2007-10-25 16:53:01<br>崔刚好像对强制转换深恶痛绝啊～<br>崔刚(崔刚) 2007-10-25 16:52:46<br>我认为依靠继承的方法不可取<br>莫书健(莫书健) 2007-10-25 16:53:19<br>实在不行，就将就强制一把，我想也可以容忍的<br>杨晓涛(杨晓涛) 2007-10-25 16:54:05<br>类本身也需要细化，寄希望一个类包含所有的接口是不现实的；<br>粗暴的将所有功能放在一个类中，也是不美观的，不招人喜欢的<br>崔刚(崔刚) 2007-10-25 16:53:45<br>不是我厌恶强制而是强制不安全，维护代码时可能发生不可意料的问题。<br>靳波(靳波) 2007-10-25 16:53:57<br>既然你已经有答案，不如公布出来让大家参详参详。<br>崔刚(崔刚) 2007-10-25 16:54:54<br>我没有答案，有的话就给你们上课了<br>莫书健(莫书健) 2007-10-25 16:56:11<br>这个课题就叫&#8220;崔刚猜想&#8221;吧<br>陶华(陶华) 2007-10-25 16:58:27<br>给C＋＋标准委员会提个需求<br>崔刚(崔刚) 2007-10-25 16:59:27<br>另，dynamic_case&lt;&gt; 需要编译器支持 RTTI<br>向官文(向官文) 2007-10-25 17:04:51<br>C++这门静态语言解决这个执行期的动态问题恐怕无解<br>也许出路在第三方的接口上吧<br>崔刚(崔刚) 2007-10-25 17:05:55<br>换句话说，大家是不是认为，在目前阶段，象ControlModule和IoControl这样的接口是相对合适的喽。<br>崔刚(崔刚) 2007-10-25 17:13:41<br>2007年10月8日，汪胜平在他的工作日志里写道：<br>关于ControlModule型接口<br>这种类型的接口有以下好处：<br>1、降低编译依赖性。<br>2、如果模块A通过接口ControlModule依赖模块B，当模块B不存在时，理论上模块A仍然可以正常工作。<br>当然它也有一个不好的地方，那就是本来简单的调用关系，因为这个接口的引入变得复杂一些了。<br>但是，这两个好处需要小心使用才能保证。<br>1、没有函数名的依赖，但是并不代表就没有编译依赖了。比较典型的是ID的依赖。ID在模块B中被定义。在A中直接包含<br>B的头文件。不过这种编译依赖可以由第三方定义ID来解决。<br>2、如果需要传递的信息比较多，我们最容易想到的方法是定义一个结构体来传递相关信息。这个结构体如果由B来定义，<br>那么A又落入了在编译上依赖B的陷阱。<br>3、如果A在调用时没有考虑好B不存在怎样处理，那么ControlModule的第二个好处就体现不出来。<br>对于ControlModule型接口。我觉得要慎用，它不是万能的。某些时候，虚函数也许更方便。 <br>=================================<br>这是一个典型的C方式函数。我觉得如果是通用的接口，可以用多态，如果是特殊函数，这样写纯属找茬。//崔刚 2007-10-12<br>=================================<br>ControlModule这类的接口，简单问题复杂化，难道只是为了<br>&#8220;降低编译依赖性&#8221;？这会不会是我们软件部附加上去的想法,<br>这类接口经常用于驱动接口(请参看linux\windows,<br>还有我们的mmos驱动模型),<br>我想最初这样做的理由会不会是这样：<br>1）为了减少接口个数。<br>2）统一属性设置/获取接口。<br>至少在驱动是这样的。<br>比如：<br>set_property1();<br>set_property2();<br>:<br>:<br>set_propertyN();<br>减少为一个<br>#define ID_PROPERTY_1&nbsp; 0<br>#define ID_PROPERTY_2&nbsp; 1<br>:<br>:<br>#define ID_PROPERTY_N&nbsp; n<br>Control( property_id, ...);<br>mosj<br><br>夏恒星(夏恒星) 2007-10-25 17:37:29<br>呵呵，原来这样的问题并不只有我遇到，俺在代码中加了注释：<br>&nbsp;&nbsp;&nbsp; //注意: 将基类指针强制转换为派生类指针并不可取<br>&nbsp;&nbsp;&nbsp; //但是此处要使用协议各层提供的非基类提供的接口<br>&nbsp;&nbsp;&nbsp; //能不能从设计上避免?<br>&nbsp;&nbsp;&nbsp; mTopProtocol = (CUartCommProtocol* )(m_pProtocolStack-&gt;GetSpecifiedLayer(UART_COMM_PROTOCOL));<br>崔刚(崔刚) 2007-10-25 17:44:02<br>这种应用更常见的地方是，把不同的派生类放到共同基类类型的指针容器里，然后把这个基类指针取出来，再干一些派生类的事情。<br>崔刚(崔刚) 2007-10-25 17:46:11<br>随便在高端里copy一段代码给大家看：<br>&nbsp;MSpinBox* pSB;<br>&nbsp;pSB = (MSpinBox*)GetWindowItem(IDC_CO_SPIN_TB_HI);<br>&nbsp;INT32 value = pSB-&gt;GetIntCur();<br>汪胜平(汪胜平) 2007-10-25 17:53:20<br>我觉得这种类型的接口比ControlModule强，<br>虽然这些接口会增加编译期依赖。<br>崔刚(崔刚) 2007-10-25 17:53:40<br>这就见仁见智了。<br>崔刚(崔刚) 2007-10-25 17:58:59<br>下班前，抄一段《JAVA编程思想》的话给各位共勉，包括发炎的没发炎但吃了药的。 <br>http://vss2/sites/jhsoftware/Lists/List13/Attachments/768/ThinkJava.bmp<br>&nbsp;<br>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$<br>太&#8220;行而上&#8221;了！不过监护软件部真是不可小觑啊！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 张进<br>&nbsp;<br>/*******************************************/<br>/* <br>我不认为这是一个&#8220;形而上&#8221;的问题，或者一个智力游戏，它有着广泛的用途，否则不会有这么多的讨论和解决方案。昨天晚上回家查了一下，&#8220;向下转型&#8221;的确是我们要在设计中避免的，但在实际设计却经常面临，目前所有语言基本都支持到dymanicv_case&lt;&gt;的地步，而这却需要RTTI的支持，虽然其他高级语言比如C#，Java，Python都在语言级别提供象&#8220;反射&#8221;等方式来解决这个问题的超集，但是此种&#8220;元类&#8221;的语言特性违背了C++的精神，想必无论如何也不会出现在C++里，因为效率的牺牲和运行时存储的需求应该也不适用于目前的嵌入式设备。<br>反过来再想想，我们何必要求非常安全的途径解决这样的问题。C++/C本来就是一种弱类型语言，不安全的特性比比皆是，所以动态强制转换未必不是一个正途。<br>另外，对于汪胜平最后说出的问题，我觉得ControlModule之类的写法可以用这种强制转换的方式解决，当然孰优孰劣就留给各位去判别了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 崔刚 2007-10-26<br>*/<br> <img src ="http://www.cppblog.com/cuigang/aggbug/38799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-17 21:30 <a href="http://www.cppblog.com/cuigang/archive/2007/12/17/38799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>20070424备忘——仿函数</title><link>http://www.cppblog.com/cuigang/archive/2007/12/17/38794.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 17 Dec 2007 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/17/38794.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/38794.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/17/38794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/38794.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/38794.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;"><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;functor{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">()(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x){<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">x</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<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;<br></span><span style="color: #008080;">&nbsp;9</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;">10</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;functor&nbsp;func;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;func(</span><span style="color: #000000;">5</span><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;">&nbsp;</span></div>
<br>仿函数可以代替函数指针，而且它可以保存状态（类里面含有成员变量），相当于函数指针指向的函数有局部静态变量，同时它可以同时存在多个实例。<br> <img src ="http://www.cppblog.com/cuigang/aggbug/38794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-17 21:25 <a href="http://www.cppblog.com/cuigang/archive/2007/12/17/38794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>20070328备忘</title><link>http://www.cppblog.com/cuigang/archive/2007/12/17/38790.html</link><dc:creator>cuigang</dc:creator><author>cuigang</author><pubDate>Mon, 17 Dec 2007 13:21:00 GMT</pubDate><guid>http://www.cppblog.com/cuigang/archive/2007/12/17/38790.html</guid><wfw:comment>http://www.cppblog.com/cuigang/comments/38790.html</wfw:comment><comments>http://www.cppblog.com/cuigang/archive/2007/12/17/38790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cuigang/comments/commentRss/38790.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cuigang/services/trackbacks/38790.html</trackback:ping><description><![CDATA[1、指向非静态成员函数的指针不是普通的指针，要包含包括this指针等信息，具体取决于编译器的实现。<br>2、指向虚的非静态的成员函数形成虚调用，指向基类的成员函数的指针可以产生对派生类重载函数的调用，可以实现C＃中的委托。<br>3、委托？反射？托管？<br> <img src ="http://www.cppblog.com/cuigang/aggbug/38790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cuigang/" target="_blank">cuigang</a> 2007-12-17 21:21 <a href="http://www.cppblog.com/cuigang/archive/2007/12/17/38790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>