﻿<?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++博客-luke</title><link>http://www.cppblog.com/luke/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 16:28:58 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 16:28:58 GMT</pubDate><ttl>60</ttl><item><title>c++标准库中endl的实现</title><link>http://www.cppblog.com/luke/archive/2009/04/01/78572.html</link><dc:creator>卢克</dc:creator><author>卢克</author><pubDate>Wed, 01 Apr 2009 07:15:00 GMT</pubDate><guid>http://www.cppblog.com/luke/archive/2009/04/01/78572.html</guid><wfw:comment>http://www.cppblog.com/luke/comments/78572.html</wfw:comment><comments>http://www.cppblog.com/luke/archive/2009/04/01/78572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luke/comments/commentRss/78572.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luke/services/trackbacks/78572.html</trackback:ping><description><![CDATA[以前一直没有关心std::endl的工作机制，最近突然想一窥究竟，于是下载了sgi的stl(<a  href="http://www.sgi.com/tech/stl/">http://www.sgi.com/tech/stl/</a>)实现,<br>于是恍然大悟，对其实现者真是敬佩。<br><br>在文件Ostream中class basic_ostream 有如下成员函数：<br><br>&nbsp;basic_ostream&amp; operator&lt;&lt; (basic_ostream&amp; (*__f)(basic_ostream&amp;))<br>&nbsp;&nbsp;&nbsp; { return __f(*this); }<br><br>&nbsp;basic_ostream&amp; operator&lt;&lt; (_Basic_ios&amp; (*__f)(_Basic_ios&amp;))<br>&nbsp;&nbsp;&nbsp; { __f(*this); return *this; }<br><br>&nbsp;basic_ostream&amp; operator&lt;&lt; (ios_base&amp; (*__f)(ios_base&amp;))<br>&nbsp;&nbsp;&nbsp; { __f(*this); return *this; }<br><br>然后有如下全局函数：<br>template &lt;class _CharT, class _Traits&gt;<br>inline basic_ostream&lt;_CharT, _Traits&gt;&amp;<br>endl(basic_ostream&lt;_CharT, _Traits&gt;&amp; __os) {<br>&nbsp; __os.put(__os.widen('\n'));<br>&nbsp; __os.flush();<br>&nbsp; return __os;<br>}<br><br>可见原来我们经常使用的cout&lt;&lt;.....&lt;&lt;endl中的endl竟然是一个函数指针，由此我们还可以找到如下定义：<br><br>// basefield manipulators, section 27.4.5.3<br>inline ios_base&amp; dec(ios_base&amp; __s)<br>&nbsp; { __s.setf(ios_base::dec, ios_base::basefield); return __s; }<br><br>inline ios_base&amp; hex(ios_base&amp; __s) <br>&nbsp; { __s.setf(ios_base::hex, ios_base::basefield); return __s; }<br><br>inline ios_base&amp; oct(ios_base&amp; __s)<br>&nbsp; { __s.setf(ios_base::oct, ios_base::basefield); return __s; }<br><br>原来这些我们经常见到的C++流输出格式符居然都是一些函数，都是通过重载&lt;&lt;操作符来实现的。<br><br><img src ="http://www.cppblog.com/luke/aggbug/78572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luke/" target="_blank">卢克</a> 2009-04-01 15:15 <a href="http://www.cppblog.com/luke/archive/2009/04/01/78572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost 中的noncopyable</title><link>http://www.cppblog.com/luke/archive/2009/03/13/76411.html</link><dc:creator>卢克</dc:creator><author>卢克</author><pubDate>Fri, 13 Mar 2009 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/luke/archive/2009/03/13/76411.html</guid><wfw:comment>http://www.cppblog.com/luke/comments/76411.html</wfw:comment><comments>http://www.cppblog.com/luke/archive/2009/03/13/76411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luke/comments/commentRss/76411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luke/services/trackbacks/76411.html</trackback:ping><description><![CDATA[今日粗看boost的代码，发现很多类都继承noncopyable，以下是noncopyable的代码：<br>class noncopyable<br>&nbsp; {<br>&nbsp;&nbsp; protected:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; noncopyable() {}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~noncopyable() {}<br>&nbsp;&nbsp; private:&nbsp; // emphasize the following members are private<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; noncopyable( const noncopyable&amp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const noncopyable&amp; operator=( const noncopyable&amp; );<br>&nbsp; };<br><br>这里的设计思想是让子类继承，但是阻止子类调用赋值和copy构造函数，有什么用呢？<br>写代码的时候我经常喜欢用singleton模式，比如那些工厂类，管理者类之类的，但是写这些<br>singleton的时候当然是希望全局只有一个，而且不希望别人在用的时候又自己创造一个，往往<br>就要每写一个singleton类就要在类的declaration中把它们的构造函数，赋值函数，析构函数，copy构造函数隐藏到<br>private或者protected之中，这样真的很累。<br>&nbsp; 现在好了，只要让这些singleton直接继承noncopyable就ok了。这样至少可以不用多写赋值和copy构造<br>函数了；构造和析构函数看情况而定了。<br><br>class noncopyable的基本思想是把构造函数和析构函数设置protected权限，这样子类可以调用，但是外面的类不能调用，<br>那么当子类需要定义构造函数的时候不至于通不过编译。但是最关键的是noncopyable把copy构造函数和copy赋值函数做成了<br>private，这就意味着除非子类定义自己的copy构造和赋值函数，否则在子类没有定义的情况下，外面的调用者是不能够通过<br>赋值和copy构造等手段来产生一个新的子类对象的。举个简单的例子：<br>class Test ： public noncopyable<br>{<br>};<br><br>void main()<br>{<br>&nbsp;&nbsp; Test a,c;<br>&nbsp;&nbsp; Test b(a);&nbsp; ///&lt;------（1） error<br><br>&nbsp;&nbsp; c = a;&nbsp;&nbsp;&nbsp;&nbsp; ///&lt;------(2) error<br>}<br><br>如果Test类没有继承 noncopyable,那么（1）和（2）都可以通过编译，但是一旦Test继承了noncopyable，则(1)和（2）都通不过<br>编译，从而可以防止调用者写一些错误的代码，这不正是我们做singleton对象所需要的吗？<br><br><br><br> <img src ="http://www.cppblog.com/luke/aggbug/76411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luke/" target="_blank">卢克</a> 2009-03-13 11:00 <a href="http://www.cppblog.com/luke/archive/2009/03/13/76411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>service 在vista和windows2008下不工作</title><link>http://www.cppblog.com/luke/archive/2008/10/13/63907.html</link><dc:creator>卢克</dc:creator><author>卢克</author><pubDate>Mon, 13 Oct 2008 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/luke/archive/2008/10/13/63907.html</guid><wfw:comment>http://www.cppblog.com/luke/comments/63907.html</wfw:comment><comments>http://www.cppblog.com/luke/archive/2008/10/13/63907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luke/comments/commentRss/63907.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luke/services/trackbacks/63907.html</trackback:ping><description><![CDATA[&nbsp; 我的service程序在windows XP 和 windows2003下工作正常。但是在vista和windows2008下安装的时候总是在启动service这一步的时候失败。一直没有找到原因。这两天集中精力，终于找到了原因，但是却解决不了这个问题。<br>&nbsp; 做了如下几个测试：<br>&nbsp; （1）把ServiceMain开始部分做成一个console程序，运行OK，这说明主要部分代码逻辑没有问题。<br>&nbsp; （2）去掉ServiceMain()中的大部分功能代码，做一个简单的service，运行OK，这说明原来的service安装和启动部分代码也没有问题。<br>&nbsp; （3）分步排除各个dll。<br>&nbsp; 最后发现导致无法启动的罪魁祸首居然是libmysql.dll，我如果在程序中屏蔽掉所有mysql的调用，等于程序启动的时候不加载libmysql.dll,那么就可以顺利启动，接着更换到最新的libmysql.dll（版本5.0.67），仍然是启动不成功；后来切换到一个同事的老版本libmysql.dll，居然可以启动成功。5.0.67版本libmysql.dll （opt）的大小是2M多，而我同事的那个libmysql.dll才1M多，难道他的版本是mysql4.x ?<br>&nbsp; 究竟是什么原因导致这个问题的？<br><br><br> <img src ="http://www.cppblog.com/luke/aggbug/63907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luke/" target="_blank">卢克</a> 2008-10-13 17:06 <a href="http://www.cppblog.com/luke/archive/2008/10/13/63907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>