ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>精品国产乱码久久久久久1区2区,久久人人爽人人爽人人片av麻烦,久久99九九国产免费看小说http://m.shnenglu.com/ant/category/4993.htmlThe dreams in which I'm dying are the best I've ever had...zh-cnThu, 20 May 2010 06:43:56 GMTThu, 20 May 2010 06:43:56 GMT60腾讯òq¿å·žæ‹›è˜æ‰‹æœºå®¢æˆ·ç«¯å¼€å‘ähå‘?/title><link>http://m.shnenglu.com/ant/archive/2010/05/19/115846.html</link><dc:creator>蚂蚾lˆç»“è€?/dc:creator><author>蚂蚾lˆç»“è€?/author><pubDate>Wed, 19 May 2010 14:14:00 GMT</pubDate><guid>http://m.shnenglu.com/ant/archive/2010/05/19/115846.html</guid><wfw:comment>http://m.shnenglu.com/ant/comments/115846.html</wfw:comment><comments>http://m.shnenglu.com/ant/archive/2010/05/19/115846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/ant/comments/commentRss/115846.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/ant/services/trackbacks/115846.html</trackback:ping><description><![CDATA[ <font face="Verdana">好久没更新日志了åQŒå‘ä¸€åˆ™å°æ‹›è˜òq¿å‘ŠåQ?br /><br />    腾讯òq¿å·žæ‹›è˜æ‰‹æœºå®¢æˆ·ç«¯å¼€å‘ähå‘?br />    åŸºæœ¬è¦æ±‚åQ?br /><b>    1).1ï½?òq´å·¥ä½œç»éªŒï¼›<br />    2).有Symbian/Andriod/iPhone手机客户端开å‘ç»éª?有Symbian C++å¼€å‘ç»éªŒè€…优å…?åQ?/b><br /><br />有æ„å‘者请è”ç³»åQšpeterfan@tencent.com</font> <br /> <br /> <img src ="http://m.shnenglu.com/ant/aggbug/115846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/ant/" target="_blank">蚂蚾lˆç»“è€?/a> 2010-05-19 22:14 <a href="http://m.shnenglu.com/ant/archive/2010/05/19/115846.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>Win32 Service的简å•å°è£?/title><link>http://m.shnenglu.com/ant/archive/2007/09/24/32769.html</link><dc:creator>蚂蚾lˆç»“è€?/dc:creator><author>蚂蚾lˆç»“è€?/author><pubDate>Mon, 24 Sep 2007 05:01:00 GMT</pubDate><guid>http://m.shnenglu.com/ant/archive/2007/09/24/32769.html</guid><wfw:comment>http://m.shnenglu.com/ant/comments/32769.html</wfw:comment><comments>http://m.shnenglu.com/ant/archive/2007/09/24/32769.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://m.shnenglu.com/ant/comments/commentRss/32769.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/ant/services/trackbacks/32769.html</trackback:ping><description><![CDATA[<p>剿®µæ—‰™—´å­¦ä¹ Windows½E‹åºè®¾è®¡åQŒåˆšå¥½å­¦åˆ°Win32 ServiceåQŒäºŽæ˜¯å†™äº†ä¸¤ä¸ªç®€å•çš„¾c»ï¼šBaseServiceå’ŒServiceCtrl。虽然功能比较简å•,但是也能适用于大多数情况。下é¢ä»‹¾l一下简å•用法,如果你刚好需è¦å†™ä¸€äº›ç®€å•çš„æœåŠ¡½E‹åºåQŒè¿™ä¸¤ä¸ª¾cÖM¹Ÿè®¸èƒ½‹z¾ä¸Šç”¨åœºåQ?br><br><span style="FONT-SIZE: 14pt"><strong style="COLOR: #993366">1. BaseService<br></strong></span><em style="COLOR: #333399">BaseService.h<br></em></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="Courier New"><span style="COLOR: #008080"> 1</span> </font> <font face="Courier New"><span style="COLOR: #000000">#ifndef BASE_SERVICE_H<br></span><span style="COLOR: #008080"> 2</span> </font> <font face="Courier New"><span style="COLOR: #000000">#define BASE_SERVICE_H<br></span><span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span></font> <font face="Courier New"><span style="COLOR: #000000"> BaseService {<br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 6</span> </font> <font face="Courier New"><span style="COLOR: #000000">    explicit BaseService(LPCTSTR szServiceName,<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">                DWORD dwServiceType </span><span style="COLOR: #000000">=</span></font> <font face="Courier New"><span style="COLOR: #000000"> SERVICE_WIN32_OWN_PROCESS,<br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">                DWORD dwStartType </span><span style="COLOR: #000000">=</span></font> <font face="Courier New"><span style="COLOR: #000000"> SERVICE_AUTO_START);<br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #000000">~</span></font> <font face="Courier New"><span style="COLOR: #000000">BaseService() {}<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    bool ParseStandardArgs(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"><span style="COLOR: #000000"> argv[]);<br></span><span style="COLOR: #008080">11</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool IsInstalled();<br></span><span style="COLOR: #008080">12</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Install();<br></span><span style="COLOR: #008080">13</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Uninstall();<br></span><span style="COLOR: #008080">14</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Start();<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Run() </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">    virtual bool OnInitialize() { </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnStop() {}<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnPause() {}<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnContinue() {}<br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnInterrogate() {}<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnShutdown() {}<br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> OnUserControl(DWORD dwControl) {}<br></span><span style="COLOR: #008080">24</span> </font> <font face="Courier New"><span style="COLOR: #000000">    ...<br></span><span style="COLOR: #008080">25</span> </font> <font face="Courier New"><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">26</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">#endif</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">BASE_SERVICE_H</span><span style="COLOR: #008000">*/</span></font> </div> <p>è¦å®žçŽ°è‡ªå·Þqš„æœåŠ¡¾cÕdªéœ€ä»ŽBaseService¾l§æ‰¿òq¶ä¸”Override相关的virtual函数å›_¯åQŒä¸‹é¢ç¤ºèŒƒä¸€ä¸ªBeepService¾c»ï¼Œè¯¥æœåŠ¡åªæ˜¯ç®€å•地æ¯éš”2¿U’beep一下,ä¸ÞZº†½Ž€å•所有代ç å‡æ”‘Öœ¨.hæ–‡äšg中:<br><em style="COLOR: #333399">BeepService.h</em></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="Courier New"><span style="COLOR: #008080"> 1</span> </font> <font face="Courier New"><span style="COLOR: #000000">#ifndef BEEP_SERVICE_H<br></span><span style="COLOR: #008080"> 2</span> </font> <font face="Courier New"><span style="COLOR: #000000">#define BEEP_SERVICE_H<br></span><span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BaseService.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 5</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BeepService : </span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000"> BaseService {<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 8</span> </font> <font face="Courier New"><span style="COLOR: #000000">    BeepService(LPCTSTR szServiceName)<br></span><span style="COLOR: #008080"> 9</span> </font> <font face="Courier New"><span style="COLOR: #000000">        :BaseService(szServiceName)<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        ,m_bPaused(</span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">        ,m_bRunning(</span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">) {}<br></span><span style="COLOR: #008080">12</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnStop() { m_bRunning </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnPause() { m_bPaused </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnContinue() { m_bPaused </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span></font> <font face="Courier New"><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">    virtual </span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"><span style="COLOR: #000000"> Run() {<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">        m_bRunning </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">while</span></font> <font face="Courier New"><span style="COLOR: #000000"> (m_bRunning) {<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span></font> <font face="Courier New"><span style="COLOR: #000000">m_bPaused)<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">                Beep(</span><span style="COLOR: #000000">800</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">800</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">2000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">22</span> </font> <font face="Courier New"><span style="COLOR: #000000">        }<br></span><span style="COLOR: #008080">23</span> </font> <font face="Courier New"><span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">volatile</span></font> <font face="Courier New"><span style="COLOR: #000000"> bool m_bPaused;<br></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">volatile</span></font> <font face="Courier New"><span style="COLOR: #000000"> bool m_bRunning;<br></span><span style="COLOR: #008080">27</span> </font> <font face="Courier New"><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">28</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">29</span> <span style="COLOR: #000000">#endif</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">BEEP_SERVICE_H</span><span style="COLOR: #008000">*/</span></font> </div> <p>通常æ¥è¯´åªé¡»è¦Override上é¢çš?个virtual函数ž®±OK了:<br>åœ?em>Run()</em>中进行实际的工作åQ?em>OnStop(),OnPause(),OnContinue()</em>则是ä¸ÞZº†å“应Service Control Manager的控制ã€?br><em style="COLOR: #333399"><br>test.cpp<br></em></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="Courier New"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">tchar.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 5</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span></font> <font face="Courier New"><span style="COLOR: #000000">argv[]) {<br></span><span style="COLOR: #008080"> 7</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">    BeepService beepService(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">));<br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span></font> <font face="Courier New"><span style="COLOR: #000000">beepService.ParseStandardArgs(argc, argv)) {<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span></font> <font face="Courier New"><span style="COLOR: #000000"> (beepService.IsInstalled()) {<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span></font> <font face="Courier New"><span style="COLOR: #000000">beepService.Start())<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">                printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The service can not run from command line.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">        } </span><span style="COLOR: #0000ff">else</span></font> <font face="Courier New"><span style="COLOR: #000000"> {<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The service is not installed, </span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">                </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">use \</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">s </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> to install.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, argv[</span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">16</span> </font> <font face="Courier New"><span style="COLOR: #000000">        }<br></span><span style="COLOR: #008080">17</span> </font> <font face="Courier New"><span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">}</span></font> </div> <p>å‡è®¾¾~–译åŽç”Ÿæˆçš„exeæ–‡äšg为beep.exeåQŒåˆ™åœ¨å‘½ä»¤è¡Œä¸­å¯ä»¥å¦‚下ä‹É用:<br><em style="COLOR: #333399">(1). beep -i    安装service(安装以厾pÈ»Ÿ˜q行时会自动å¯åЍ)<br>(2). beep -u   å¸è²service(如果service正在˜q行åQŒåˆ™å…ˆåœæ­¢serviceå†å¸è½?<br></em>BaseServiced çš„ParseStandardArgs正是用æ¥è§£æžä¸Šè¿°ä¸¤ä¸ªå‘½ä×oã€?br><br><span style="FONT-SIZE: 14pt"><strong style="COLOR: #993366">2. ServiceCtrl<br></strong></span>虽然Windows自带的Service Control Managerå¯ä»¥æŽ§åˆ¶æœåŠ¡½E‹åºåQŒä½†æ˜¯å¾ˆå¤šæ—¶å€™æˆ‘们都需è¦ç”¨ä»£ç æŽ§åˆ¶åQŒè¿™ž®Þq”¨åˆ°ServiceCtrl¾c»ï¼Œè¯¥ç±»çš„æŽ¥å£å¦‚下:<br><em style="COLOR: #333399">ServiceCtrl.h</em></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="Courier New"><span style="COLOR: #008080"> 1</span> </font> <font face="Courier New"><span style="COLOR: #000000">#ifndef SERVICE_CTRL_H<br></span><span style="COLOR: #008080"> 2</span> </font> <font face="Courier New"><span style="COLOR: #000000">#define SERVICE_CTRL_H<br></span><span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span></font> <font face="Courier New"><span style="COLOR: #000000"> ServiceCtrl {<br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span></font> <font face="Courier New"><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 6</span> </font> <font face="Courier New"><span style="COLOR: #000000">    ServiceCtrl(LPCTSTR szServiceName);<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">    </span><span style="COLOR: #000000">~</span></font> <font face="Courier New"><span style="COLOR: #000000">ServiceCtrl();<br></span><span style="COLOR: #008080"> 8</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Start();<br></span><span style="COLOR: #008080"> 9</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Pause();<br></span><span style="COLOR: #008080">10</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Continue();<br></span><span style="COLOR: #008080">11</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Stop();<br></span><span style="COLOR: #008080">12</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool Interrogate();<br></span><span style="COLOR: #008080">13</span> </font> <font face="Courier New"><span style="COLOR: #000000">    bool UserControl(DWORD dwControl);<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    DWORD State() </span><span style="COLOR: #0000ff">const</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">15</span> </font> <font face="Courier New"><span style="COLOR: #000000">    ...<br></span><span style="COLOR: #008080">16</span> </font> <font face="Courier New"><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">17</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">#endif</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">SERVICE_CTRL_H</span><span style="COLOR: #008000">*/</span></font> </div> <p>æŽ¥å£æ¯”较直观没什么好说的åQŒçœ‹ä¸‹é¢çš„示例代ç ï¼š<br><em><font color=#333399>test.cpp</font></em></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="Courier New"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">tchar.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">exception</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ServiceCtrl.h</span><span style="COLOR: #000000">"</span></font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 7</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span></font> <font face="Courier New"><span style="COLOR: #000000">argv[]) {<br></span><span style="COLOR: #008080"> 9</span> </font> <span style="COLOR: #000000"><br></span><font face="Courier New"><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">try</span></font> <font face="Courier New"><span style="COLOR: #000000"> {<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">        ServiceCtrl servCtrl(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BeepService</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">));<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (servCtrl.State() </span><span style="COLOR: #000000">!=</span></font> <font face="Courier New"><span style="COLOR: #000000"> SERVICE_STOPPED) {<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Service already started.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">        } </span><span style="COLOR: #0000ff">else</span></font> <font face="Courier New"><span style="COLOR: #000000"> {<br></span><span style="COLOR: #008080">15</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Start();<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Start.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">6000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">18</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Pause();<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Pause.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">6000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">21</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Continue();<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Continue.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">            Sleep(</span><span style="COLOR: #000000">6000</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">24</span> </font> <font face="Courier New"><span style="COLOR: #000000">            servCtrl.Stop();<br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Stop.\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">26</span> </font> <font face="Courier New"><span style="COLOR: #000000">        }<br></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">    } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (std::exception </span><span style="COLOR: #000000">&</span></font> <font face="Courier New"><span style="COLOR: #000000">e) {<br></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000">        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span></font> <font face="Courier New"><span style="COLOR: #000000">, e.what());<br></span><span style="COLOR: #008080">29</span> </font> <font face="Courier New"><span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> <font face="Courier New"><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">}</span></font> </div> <br>æºä»£ç ï¼š<a title=ç‚¹å‡»ä¸‹è² href="http://m.shnenglu.com/Files/ant/Service.rar">点击下è²</a><br> <img src ="http://m.shnenglu.com/ant/aggbug/32769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/ant/" target="_blank">蚂蚾lˆç»“è€?/a> 2007-09-24 13:01 <a href="http://m.shnenglu.com/ant/archive/2007/09/24/32769.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>从Win32 APIž®è£…Thread¾c»[2]http://m.shnenglu.com/ant/archive/2007/08/31/31280.html蚂蚾lˆç»“è€?/dc:creator>蚂蚾lˆç»“è€?/author>Fri, 31 Aug 2007 03:58:00 GMThttp://m.shnenglu.com/ant/archive/2007/08/31/31280.htmlhttp://m.shnenglu.com/ant/comments/31280.htmlhttp://m.shnenglu.com/ant/archive/2007/08/31/31280.html#Feedback6http://m.shnenglu.com/ant/comments/commentRss/31280.htmlhttp://m.shnenglu.com/ant/services/trackbacks/31280.html(functor and function object)ä½œäØ“æž„é€ å‡½æ•°å‚æ•°ã€‚如果你熟悉STLåQŒä½ åº”该熟悉bind1stå’Œbind2nd˜q™ä¸¤ä¸ªå‡½æ•°é…接器(function adapter)åQŒbind1stå’Œbind2ndå¯ä»¥ž®†ä¸€ä¸ªäºŒå…ƒå‡½æ•?binary function)è½¬æ¢æˆä¸€å…ƒå‡½æ•?unary function)ã€‚äØ“äº†ä‹ÉThread¾c»èƒ½å¤Ÿç”¨æ™®é€šå‡½æ•°å’Œå‡½æ•°å¯¹è±¡ä½œäØ“å‚æ•°åQŒæˆ‘们需è¦ä¸€ä¸ªbindž®†ä¸€å…ƒå‡½æ•°è{æ¢æˆæ— å‚函数åQ?br />bind.h
 1 #ifndef BIND_H
 2 
#define BIND_H
 3 

 4 template <class _Result>
 5 struct trivial_function {
 6 
    typedef _Result result_type;
 7 
};
 8 

 9 template <class _Operation>
10 class binder : public trivial_function<typename _Operation::result_type> {
11 public
:
12     binder(const _Operation& x, const typename _Operation::argument_type&
y)
13 
        :op(x), value(y) {}
14     typename _Operation::result_type operator()() const
 {
15         return
 op(value);
16 
    }
17 protected
:
18 
    _Operation op;
19 
    typename _Operation::argument_type value;
20 
};
21 

22 template <class _Operation, class _Tp>
23 inline binder<_Operation> 
24 bind(const _Operation& __fn, const _Tp&
 __x) 
25 
{
26 
    typedef typename _Operation::argument_type _Arg_type;
27     return binder<_Operation>
(__fn, _Arg_type(__x));
28 
}
29 

30 #endif/*BIND_H*/

有了bind我们˜q˜éœ€è¦ä¿®æ”¹Thread¾cÈš„构造函敎ͼŒæ˜„¡„¶æˆ‘们必须ž®†æž„é€ å‡½æ•°å£°æ˜ŽäØ“æˆå‘˜æ¨¡æ¿(˜q˜æœ‰ä¸€¿U方法也å¯ä»¥è¾‘Öˆ°åŒæ ·çš„目的,ž®±æ˜¯æŠŠThread¾cÕd£°æ˜Žäؓ模æ¿åQŒä½†æ˜¯è¿™æ ïLš„设计好åƒä¸å¤ªå¥?åQŒè¿™æ äh‰èƒ½å¤Ÿè®©Thread¾cÈš„构造函数å¯ä»¥æŽ¥å—å„¿Uç±»åž‹çš„å‚æ•°åQŒä¿®æ”¹åŽçš„æž„造函数应该能够ä‹É用如下三¿Uç±»åž‹çš„å‚æ•°åQ?br />1.Runnable *
2.no argument function
3.no argument functor
䏋颿˜¯ä¿®æ”¹åŽçš„头文äšgåQ?br />runnable.h
 1 #ifndef RUNNABLE_H
 2 
#define RUNNABLE_H
 3 

 4 struct Runnable {
 5     virtual void run() = 0
;
 6     virtual ~
Runnable() {}
 7 
};
 8 

 9 template <class T>
10 class RunnableFunctor : public Runnable {
11 public
:
12     RunnableFunctor(const T&
f) :_func(f) {}
13     virtual void
 run() { _func(); }
14 private
:
15 
    T _func;
16 
};
17 

18 //base template for no argument functor
19 template <class T>
20 struct FuncImpl {
21     static Runnable* transfer(const T&
t) {
22         return new RunnableFunctor<T>
(t);
23 
    }
24 
};
25 

26 //partial specialization for T*
27 template <class T>
28 struct FuncImpl<T*> {
29     static Runnable* transfer(T*
t) {
30         return
 t;
31 
    }
32 
};
33 

34 //partial specialization for no argument function
35 template <class T>
36 struct FuncImpl<T (*)()> {
37     static Runnable* transfer(T (*
t)()) {
38         return new RunnableFunctor<T (*)()>
(t);
39 
    }
40 
};
41 

42 template <class T>
43 inline Runnable* transfer(const T& t) {
44     return FuncImpl<T>
::transfer(t);
45 
}
46 

47 #endif/*RUNNABLE_H*/

thread.h
 1 #ifndef THREAD_H
 2 
#define THREAD_H
 3 

 4 #include <windows.h>
 5 #include "bind.h"
 6 #include "runnable.h"
 7 
 8 #define CLASS_UNCOPYABLE(classname) \
 9     private
: \
10     classname(const classname&
); \
11     classname& operator=(const classname&
);
12 

13 class Thread : public Runnable {
14 
    CLASS_UNCOPYABLE(Thread)
15 public
:
16 
    Thread()
17         :_target(0
)
18         ,_handle(0
) {
19 

20     }
21     template <class T>

22     explicit Thread(const T& op)
23 
        :_target(transfer(op))
24         ,_handle(0
) {
25 

26     }
27     virtual ~
Thread();
28     virtual void
 run() {}
29     void
 start();
30     void
 join();
31 private
:
32     static unsigned __stdcall threadProc(void*
param);
33 private
:
34     Runnable*
_target;
35 
    HANDLE _handle;
36 
};
37 

38 #endif/*THREAD_H*/

thread.cppå’Œå‰ä¸€½‹‡çš„å‡ ä¹Žä¸€æ øP¼Œå”¯ä¸€çš„ä¸åŒæ˜¯åŽÀLŽ‰äº†æž„é€ å‡½æ•°Thread(Runnable *)åQŒå› ä¸ºçŽ°åœ¨çš„æž„é€ å‡½æ•°æ”¹æˆäº†æˆå‘˜æ¨¡æ¿åQŒå®žçŽîC¹Ÿæ”‘Öœ¨thread.h中了。现在的构造函数能够接å—å„¿Uç±»åž‹çš„å‚æ•°åQŒä¸»è¦å½’功于模æ¿å‡½æ•°transferåQŒå®žçŽîC»£ç åœ¨runnable.hä¸­ï¼Œä¸»è¦æŠ€å·§æ˜¯ç”¨ç±»çš„å特化模拟函数模æ¿çš„å特化åQŒä¸æ˜Žç™½çš„请çœ?a id="_117bf2a46b69_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl01_TitleUrl" href="/ant/archive/2007/08/30/31201.html">ä¸ÞZ»€ä¹ˆä¸è¦ç‰¹åŒ–函数模ç‰?/a>ã€?br />
䏋颿˜¯æµ‹è¯•代ç ï¼š
test.cpp
 1 #include "thread.h"
 2 #include <iostream>
 3 #include <functional>
 4 
 5 using namespace std;
 6 

 7 //no argument function
 8 void print() {
 9     cout << "print" <<
 endl;
10 
}
11 

12 //unary function
13 void print1(int n) {
14     cout << "print1" <<
 endl;
15 
}
16 

17 //binary function
18 void print2(int m, int n) {
19     cout << "print2" <<
 endl;
20 
}
21 

22 
23 //no argument functor
24 struct PrintFunctor {
25     void operator()() const
 {
26         cout << "PrintFunctor" <<
 endl;
27 
    }
28 
};
29 

30 //unary functor
31 struct PrintFunctor1 : public unary_function<int, void> {
32     void operator()(int n) const
 {
33         cout << "PrintFunctor1" <<
 endl;
34 
    }
35 
};
36 

37 //binary functor
38 struct PrintFunctor2 : public binary_function<int, int, void> {
39     void operator()(int m, int n) const
 {
40         cout << "PrintFunctor2" <<
 endl;
41 
    }
42 
};
43 

44 int main() {
45 

46     //construct Thread with no argument function
47     Thread thread1(&print);
48 
    thread1.start();
49 

50     //construct Thread with unary function
51     Thread thread2(bind(ptr_fun(print1), 5));
52 
    thread2.start();
53 

54     //construct Thread with binary function
55     Thread thread3(bind(bind1st(ptr_fun(print2), 1), 2));
56 
    thread3.start();
57 

58 
59     //construct Thread with no argument functor
60     Thread thread4((PrintFunctor()));
61 
    thread4.start();
62 

63     //construct Thread with unary functor
64     Thread thread5(bind(PrintFunctor1(), 5));
65 
    thread5.start();
66 

67     //construct Thread with binary functor
68     Thread thread6(bind(bind1st(PrintFunctor2(), 1), 2));
69 
    thread6.start();
70 

71     thread1.join();
72 
    thread2.join();
73 
    thread3.join();
74 
    thread4.join();
75 
    thread5.join();
76 
    thread6.join();
77 

78     return 0;
79 }

当然了,上é¢çš„åÆˆä¸æ˜¯å…¨éƒ¨åQŒä¿®æ”¹åŽçš„Thread¾cÖM¸ä»…能够ä‹É用原先的从Thread¾cÈ‘ô承或者实现Runnable接å£çš„æ–¹æ³•,˜q˜å¯ä»¥ä‹É用ä“Q何无å‚函数或无å‚函数对象。除了test.cpp里示范的åQŒä½ ç”šè‡³å¯ä»¥ç”¨bind,bind1st,bind2st,mem_fun,mem_fun_refçš„ç»„åˆæ¥ç”¨æŸä¸ªç±»çš„æˆå‘˜å‡½æ•îC½œä¸ºå‚敎ͼŒå…ähœ‰­‘…强的絋zÀL€§ã€?br />
ç›®å‰å®žçŽ°çš„è¿™äº›éƒ½æ˜¯Thread¾cÀLœ€åŸºæœ¬çš„功能,其他功能如设¾|®çº¿½E‹ä¼˜å…ˆçñ”åQŒæŒ‚èµähˆ–æ¢å¤¾U¿ç¨‹åQŒå¼‚常处ç†ç­‰å…·ä½“实现都比较简å•,˜q™è¿™é‡Œå°±ä¸ä¸€ä¸€å®žçŽ°äº†ã€?
æºä»£ç ä¸‹è½½ï¼šç‚¹å‡»ä¸‹è²


]]>
C++&Win32写的½Iºå½“接龙http://m.shnenglu.com/ant/archive/2007/08/30/31234.html蚂蚾lˆç»“è€?/dc:creator>蚂蚾lˆç»“è€?/author>Thu, 30 Aug 2007 13:37:00 GMThttp://m.shnenglu.com/ant/archive/2007/08/30/31234.htmlhttp://m.shnenglu.com/ant/comments/31234.htmlhttp://m.shnenglu.com/ant/archive/2007/08/30/31234.html#Feedback18http://m.shnenglu.com/ant/comments/commentRss/31234.htmlhttp://m.shnenglu.com/ant/services/trackbacks/31234.html½Iºå½“接龙游æˆåQŒå†™äº†ä¸€ä¸ªç¤¼æ‹œï¼Œå®Œå…¨ä»¿windows的呵å‘üc€?br>ä¸è¿‡ä¹Ÿä¸å…¨ä¸€æ øP¼Œæœ‰ä¸€äº›ç»†èŠ‚ä¸€ç›´æ²¡æœ‰æ—¶é—´å¼„åQŒæ²¡åŠžæ³•æœ€˜q‘比较懒...

与windows下的相比åQŒæˆ‘åšçš„˜q™ä¸ªåŠ å…¥äº?span style="COLOR: #993300">AI(å¿«æ·é”®F6)åQŒå¯ä»¥å¼€å?span style="COLOR: #993300">¿UȉŒæç¤º(å¿«æ·é”®F7)åQŒä¸˜q?span style="COLOR: #993300">撤销一直没有åšåQŒå¯èƒ½å“ªå¤©çªç„¶æƒ³åšäº†ä¼šåŠ ä¸ŠåŽ»ã€‚å¦å¤–改˜q›äº†åºŸç‰Œå›žæ”¶½Ž—法åQŒéžæ³•移牌的æç¤ºç›´æŽ¥åŽÀLŽ‰äº†ï¼Œ˜q˜æœ‰ä¸€äº›å°çš„细节作了改˜q›ã€?br>感兴­‘£çš„å¯ä»¥ä¸‹è²åQ?a title=ç‚¹å‡»ä¸‹è² href="http://m.shnenglu.com/Files/ant/Freecell.rar">点击下è²
æºä»£ç ä¸‹è½½ï¼šç‚¹å‡»ä¸‹è²
™åÞZ¾¿å‘几张截图:







]]>
ä¸ÞZ»€ä¹ˆä¸è¦ç‰¹åŒ–函数模ç‰?/title><link>http://m.shnenglu.com/ant/archive/2007/08/30/31201.html</link><dc:creator>蚂蚾lˆç»“è€?/dc:creator><author>蚂蚾lˆç»“è€?/author><pubDate>Thu, 30 Aug 2007 05:55:00 GMT</pubDate><guid>http://m.shnenglu.com/ant/archive/2007/08/30/31201.html</guid><wfw:comment>http://m.shnenglu.com/ant/comments/31201.html</wfw:comment><comments>http://m.shnenglu.com/ant/archive/2007/08/30/31201.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://m.shnenglu.com/ant/comments/commentRss/31201.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/ant/services/trackbacks/31201.html</trackback:ping><description><![CDATA[ <p> <font face="Verdana" color="#006666">Overloading vs. Specialization</font> <br /> <br />在C++中有<em>class templates</em> å’?em>function templates</em>åQŒè¿™ä¸¤ç§æ¨¡ç‰ˆæœ‰å¾ˆå¤šåŒºåˆ«ï¼Œæœ€é‡è¦çš„区别就是é‡è½?overloading)åQ?br />普通的C++¾cÖM¸èƒ½é‡è½½ï¼Œå½“ç„¶¾cÀL¨¡ç‰ˆä¹Ÿä¸èƒ½é‡è²åQ›ç›¸å,普通函数å¯ä»¥é‡è½½ï¼Œå‡½æ•°æ¨¡ç‰ˆä¹Ÿèƒ½é‡è²ã€‚è¿™å†æ­£å¸æ€¸˜q‡ï¼Œçœ‹ä¸‹é¢çš„代ç åQ?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> Example 1: Class vs. function template, and overloading <br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> A class template</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> X { </span><span style="COLOR: #008000">/*...</span><span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> };      </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> (a)<br /></span> <span style="COLOR: #008080"> 6</span> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> A function template with two overloads</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f( T );              </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (b)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">, T, </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> ); </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> (c)<br /></span> <span style="COLOR: #008080">10</span> <span style="COLOR: #008000"></span></font> </div> <p>åƒä¸Šé¢æœªç‰¹åŒ–的模æ‰K€šå¸¸å«åš<em>base templates</em>。当ç„Óž¼Œ<em>base templates</em>能够被特化,在特化这一点上<br /><em>class templates</em> å’?em>function templates</em>有很大的区别åQšä¸€ä¸?em>class template</em> 能够è¢?em>partially specialized</em> and/or <br /><em>fully specialized</em>åQŒä¸€ä¸?em>function template</em>åªèƒ½è¢?em>fully specialized</em>åQŒä½†æ˜¯ç”±äº?em>function template</em>s能够é‡è²æˆ‘们å¯ä»¥é€šè¿‡é‡è²æ¥å®žçŽ°å’Œ<em>partially specialized</em> 相当的功能。下é¢çš„代ç è¯´æ˜Žäº†è¿™äº›åŒºåˆ«ï¼š</p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> Example 1, continued: Specializing templates <br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 3</span> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> A partial specialization of (a) for pointer types </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> X</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">*></span><span style="COLOR: #000000"> { </span><span style="COLOR: #008000">/*...</span><span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span></font> <font face="Courier New"> <span style="COLOR: #000000"> };<br /></span> <span style="COLOR: #008080"> 6</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> A full specialization of (a) for int </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> X</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> { </span><span style="COLOR: #008000">/*...</span><span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span></font> <font face="Courier New"> <span style="COLOR: #000000"> };<br /></span> <span style="COLOR: #008080"> 9</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> A separate base template that overloads (b) and (c) <br /></span> <span style="COLOR: #008080">11</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> -- NOT a partial specialization of (b), because <br /></span> <span style="COLOR: #008080">12</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> there's no such thing as a partial specialization <br /></span> <span style="COLOR: #008080">13</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> of a function template! </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">14</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f( T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> );             </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> (d)<br /></span> <span style="COLOR: #008080">15</span> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">16</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> A full specialization of (b) for int </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">17</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> );              </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> (e)<br /></span> <span style="COLOR: #008080">18</span> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">19</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> A plain old function that happens to overload with <br /></span> <span style="COLOR: #008080">20</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> (b), (c), and (d) -- but not (e), which we'll <br /></span> <span style="COLOR: #008080">21</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> discuss in a moment </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">22</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f( </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> );                           </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> (f)<br /></span> <span style="COLOR: #008080">23</span> <span style="COLOR: #008000"></span></font> </div> <p>æ ÒŽ®å‡½æ•°é‡è²è§£æžè§„则åQ?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> Example 1, continued: Overload resolution <br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span></font> <font face="Courier New"> <span style="COLOR: #000000">bool b; <br /></span> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span></font> <font face="Courier New"> <span style="COLOR: #000000"> i; <br /></span> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">double</span></font> <font face="Courier New"> <span style="COLOR: #000000"> d;<br /></span> <span style="COLOR: #008080"> 6</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">f( b );        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> calls (b) with T = bool </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">f( i, </span><span style="COLOR: #000000">42</span><span style="COLOR: #000000">, d ); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> calls (c) with T = int </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">f( </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i );       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> calls (d) with T = int </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">f( i );        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> calls (e) </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">11</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">f( d );        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> calls (f)</span></font> </div> <p>上é¢è¯´çš„˜q™äº›å…¶å®žéƒ½æ˜¯å¾ˆç®€å•的情况åQŒå¤§å¤šæ•°äººå¾ˆå®ÒŽ˜“ž®Þpƒ½æ˜Žç™½åQŒä¸‹é¢çš„æ‰æ˜¯å®ÒŽ˜“让ähå¼„æØœçš„ï¼š<br /><br />1.考虑如下代ç åQ?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> Example 2: Explicit specialization <br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (a) a base template </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"> <span style="COLOR: #000000"> f( T );<br /></span> <span style="COLOR: #008080"> 5</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (b) a second base template, overloads (a) </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f( T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> );     </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000">     (function templates can't be partially <br /></span> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #008000">                  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">     specialized; they overload instead)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #008000"></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (c) explicit specialization of (b) </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">11</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">12</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">13</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ...</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">14</span> <span style="COLOR: #008000"></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">15</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">p; <br /></span> <span style="COLOR: #008080">16</span> <span style="COLOR: #000000">f( p );           </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> calls (c)</span></font> </div> <p>最åŽä¸€è¡Œçš„¾l“æžœåƒå¤§å¤šæ•°äººæ‰€æœŸæœ›çš„ä¸€æ øP¼Œé—®é¢˜æ˜¯ï¼šä¸ÞZ»€ä¹ˆæœŸæœ›æ˜¯˜q™ä¸ª¾l“æžœåQ?br />如果你期望的原因是错误的åQŒæŽ¥ä¸‹æ¥çš„ä¸€å®šä¼šè®©ä½ å¥½å¥‡ã€‚ä¹Ÿè®æ€½ ä¼šè¯´åQ?æˆ‘äØ“<span style="COLOR: #3366ff">int*</span>写了一个特化版本,<span style="COLOR: #3366ff">f(p)</span>当然会调ç”?span style="COLOR: #3366ff">c</span>"åQŒä¸òq¸çš„æ˜¯ï¼Œ˜q™æ­£æ˜¯é”™è¯¯çš„原因!!!<br /><br />2.å†è€ƒè™‘下é¢çš„代ç ï¼š</p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> Example 3<br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (a) same old base template as before </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span></font> <font face="Courier New"> <span style="COLOR: #000000"> f( T );<br /></span> <span style="COLOR: #008080"> 5</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (c) explicit specialization, this time of (a)</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080"> 8</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (b) a second base template, overloads (a) </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> f( T</span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000"> );<br /></span> <span style="COLOR: #008080">11</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">12</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ...</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">13</span> <span style="COLOR: #008000"></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">14</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">p; <br /></span> <span style="COLOR: #008080">15</span> <span style="COLOR: #000000">f( p );           </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> calls (b)! overload resolution ignores <br /></span> <span style="COLOR: #008080">16</span> <span style="COLOR: #008000">                  </span><span style="COLOR: #008000">//</span></font> <font face="Courier New"> <span style="COLOR: #008000"> specializations and operates on the base <br /></span> <span style="COLOR: #008080">17</span> <span style="COLOR: #008000">                  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> function templates only</span></font> </div> <p>如果˜q™ä¸ª¾l“果让你感到惊奇åQŒé‚£ž®±å¯¹äº†ï¼å¾ˆå¤šäººéƒ½ä¼šæ„Ÿåˆ°æƒŠå¥‡ï¼<br />ç†è§£˜q™ä¸ªçš„关键是åQ?em style="COLOR: #993300">Specializations don't overload,only the base templates overload.<br /></em><br />é‡è²è§£æžä»…仅选择base template(或者nontemplate functionåQŒå¦‚果有的è¯)åQŒåªæœ‰å½“¾~–译器已¾l决定了哪个<br />base templatež®†ä¼šè¢«é€‰æ‹©åQŒç¼–译器æ‰ä¼š¾l§ç®‹å¾€ä¸‹å¯»æ‰ùN€‚åˆçš„特化版本,如果扑ֈ°äº†å°±ä½¿ç”¨é‚£ä¸ªç‰¹åŒ–版本ã€?br /><br />最åŽï¼Œåº”当é¿å…特化函数模æ¿åQŒä¹Ÿè¦é¿å…é‡è½½å‡½æ•°æ¨¡æ?nontemplate functionçš„é‡è½½å½“然没问题)。如果一定覘q™æ ·åQŒå¯ä»¥ä‹É用如下方法模拟函数模æ¿çš„å特化:</p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">//</span><span style="COLOR: #008000">base template class, </span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template </span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 3</span> </font> <font face="Courier New"> <span style="COLOR: #000000">struct FuncImpl {<br /></span> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">users, go ahead and specialize this</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> apply(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> T </span><span style="COLOR: #000000">&</span></font> <font face="Courier New"> <span style="COLOR: #000000">t) {<br /></span> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080"> 7</span> </font> <font face="Courier New"> <span style="COLOR: #000000">    }<br /></span> <span style="COLOR: #008080"> 8</span> </font> <font face="Courier New"> <span style="COLOR: #000000">};<br /></span> <span style="COLOR: #008080"> 9</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">partial specialazation for int</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">11</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template </span><span style="COLOR: #000000"><></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">12</span> <span style="COLOR: #000000">struct FuncImpl</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span></font> <font face="Courier New"> <span style="COLOR: #000000"> {<br /></span> <span style="COLOR: #008080">13</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> apply(</span><span style="COLOR: #0000ff">int</span></font> <font face="Courier New"> <span style="COLOR: #000000"> t) {<br /></span> <span style="COLOR: #008080">14</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span></font> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">15</span> </font> <font face="Courier New"> <span style="COLOR: #000000">    }<br /></span> <span style="COLOR: #008080">16</span> </font> <font face="Courier New"> <span style="COLOR: #000000">};<br /></span> <span style="COLOR: #008080">17</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">18</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">partial specialazation for T*</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">19</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template </span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">20</span> <span style="COLOR: #000000">    struct FuncImpl</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T </span><span style="COLOR: #000000">*></span></font> <font face="Courier New"> <span style="COLOR: #000000"> {<br /></span> <span style="COLOR: #008080">21</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> apply(T </span><span style="COLOR: #000000">*</span></font> <font face="Courier New"> <span style="COLOR: #000000">t) {<br /></span> <span style="COLOR: #008080">22</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span></font> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">23</span> </font> <font face="Courier New"> <span style="COLOR: #000000">    }<br /></span> <span style="COLOR: #008080">24</span> </font> <font face="Courier New"> <span style="COLOR: #000000">};<br /></span> <span style="COLOR: #008080">25</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">26</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">users, don't touch this!</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">27</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">template </span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> T</span><span style="COLOR: #000000">></span></font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">28</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> func(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> T </span><span style="COLOR: #000000">&</span></font> <font face="Courier New"> <span style="COLOR: #000000">t) {<br /></span> <span style="COLOR: #008080">29</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> FuncImpl</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">></span></font> <font face="Courier New"> <span style="COLOR: #000000">::apply(t);<br /></span> <span style="COLOR: #008080">30</span> </font> <font face="Courier New"> <span style="COLOR: #000000">}<br /></span> <span style="COLOR: #008080">31</span> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">32</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span></font> <font face="Courier New"> <span style="COLOR: #000000">, r;<br /></span> <span style="COLOR: #008080">33</span> <span style="COLOR: #000000">r </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> func(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">r = 0</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">34</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">r </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> func(</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">r = 1</span></font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <span style="COLOR: #008080">35</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">r </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> func(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">i); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">r = 2</span></font> </div> <img src ="http://m.shnenglu.com/ant/aggbug/31201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/ant/" target="_blank">蚂蚾lˆç»“è€?/a> 2007-08-30 13:55 <a href="http://m.shnenglu.com/ant/archive/2007/08/30/31201.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>从Win32 APIž®è£…Thread¾c»[1]http://m.shnenglu.com/ant/archive/2007/08/30/31190.html蚂蚾lˆç»“è€?/dc:creator>蚂蚾lˆç»“è€?/author>Thu, 30 Aug 2007 02:18:00 GMThttp://m.shnenglu.com/ant/archive/2007/08/30/31190.htmlhttp://m.shnenglu.com/ant/comments/31190.htmlhttp://m.shnenglu.com/ant/archive/2007/08/30/31190.html#Feedback7http://m.shnenglu.com/ant/comments/commentRss/31190.htmlhttp://m.shnenglu.com/ant/services/trackbacks/31190.htmlå‰å‡ å¤©åœ¨å­¦Windows多线½E‹ç¨‹åºè®¾è®¡ï¼Œå‘现Win32 API用è“væ¥ç¡®å®žä¸æ€Žä¹ˆæ–¹ä¾¿åQŒç‰¹åˆ«æ˜¯å¯¹äºŽC++½E‹åºå‘˜ã€‚于是实çŽîCº†ä¸€ä¸ªç®€å•çš„ž®è£…åQŒæŠ€æœ¯å«é‡å½“ç„¶ä¸é«˜ï¼Œä¸è¿‡ç”¨è“væ¥è¿˜æ˜¯æ¯”较方便的。如果你熟悉JavaåQŒä½ ä¼šå‘现这个实现有点åƒJavaçš„ThreadåQŒåœ¨Javaä¸­æœ‰ä¸¤ç§æ–ÒŽ³•å¯ä»¥åˆ›å¾ä¸€ä¸ªThreadåQ?br />
1.从Thread¾cÈ‘ôæ‰¿åÆˆå®žçŽ°runæ–ÒŽ³•åQ?/p>
1 class MyThread extends  Thread {
2     public void
 run() {
3 
        ...
4 
    } 
5 
};
6 

7 //å¼€å¯çº¿½E?/span>
8 MyThread thread = new  MyThread;
9 thread.start();

2.声明一个类实现Runnable接å£òq¶å®žçްrunæ–ÒŽ³•åQ?/p>

1 class MyRunnable implements  Runnable {
2     public void
 run() {
3 
        ...
4 
    }
5 
};
6 

7 // 开å¯çº¿½E‹Â?/span>
8 MyThread thread = new MyThread(new  MyRunnable);
9 thread.start();


具体实现
Java的实现方å¼è¿˜½Ž—优雅,我们也å¯ä»¥åœ¨C++中模拟,ç”׃ºŽ½‹‡å¹…所é™ï¼Œåœ¨è¿™é‡Œæˆ‘们åªå…Ïx³¨åŸºæœ¬åŠŸèƒ½çš„å®žçŽŽÍ¼š
thread.h
 1 #ifndef THREAD_H
 2 
#define THREAD_H
 3 

 4 #include <windows.h>
 5 
 6 #define CLASS_UNCOPYABLE(classname) \
 7     private
: \
 8     classname(const classname&
); \
 9     classname& operator=(const classname&
);
10 

11 struct Runnable {
12     virtual void run() = 0
;
13     virtual ~
Runnable() {}
14 
};
15 

16 class Thread : public Runnable {
17 
    CLASS_UNCOPYABLE(Thread)
18 public
:
19     explicit Thread(Runnable* target = 0
);
20     virtual ~
Thread();
21     virtual void
 run() {}
22     void
 start();
23     void
 join();
24 private
:
25     static unsigned __stdcall threadProc(void*
param);
26 private
:
27     Runnable*
_target;
28 
    HANDLE _handle;
29 
};
30 

31 #endif/*THREAD_H*/

在上é¢çš„代ç ä¸­æˆ‘们先定义一个Runnable¾c»ï¼Œòq¶äØ“Runnable¾cÀL·»åŠ çº¯è™šå‡½æ•°runåQŒéœ€è¦ç‰¹åˆ«æ³¨æ„的是Runnable¾cÈš„è™šæžæž„函敎ͼŒä»ÖM½•惌™¦æˆäؓ基类的classéƒ½åº”è¯¥å£°æ˜Žæžæž„函æ•îCØ“virtualã€?br />Thread¾cÈ›´æŽ¥ç‘ô承自RunnableåQŒCLASS_UNCOPYABLE(Thread) ˜q™ä¸€è¡Œç”¨å®å£°æ˜ŽThread¾cÖM¸å¯æ‹·è´ï¼Œå…·ä½“¾l†èŠ‚è¯ïLœ‹ 考虑用Macro替æ¢Uncopyable 。startæˆå‘˜å‡½æ•°å’ŒJavaä¸­çš„ä¸€æ øP¼Œç”¨æ¥å¼€å¯ä¸€ä¸ªçº¿½E‹ï¼Œjoinæˆå‘˜å‡½æ•°ç”¨æ¥é˜Õd¡žå½“剾U¿ç¨‹ç›´åˆ°å¼€å¯çš„¾U¿ç¨‹æ‰§è¡Œå®Œæ¯•。threadProcä½œäØ“é™æ€æˆå‘˜å‡½æ•°ç”¨æ¥ä¼ é€’ç»™_beginthreadexåQŒè‡³äºŽäؓ什么用_beginthreadex代替CreateThread请问Googleã€‚åˆæ­¥çš„实现都比较简å•,直接贴上代ç åQ?br />thread.cpp
 1 #include "thread.h"
 2 #include <process.h> // for _beginthreadex
 3 
 4 Thread::Thread(Runnable* target /*= 0*/)
 5 :_target(target
)
 6 ,_handle(0
) {
 7 

 8 }
 9 

10 Thread::~Thread() {
11     if (_handle != 0
)
12 
        CloseHandle(_handle);
13     if (_target != 0
)
14 
        delete _target;
15 
}
16 

17 void Thread::start() {
18     if (_handle != 0
)
19         return
;
20 
    unsigned id;
21     _handle = reinterpret_cast<HANDLE>
(
22         _beginthreadex(0, 0, threadProc, this, 0, &
id)
23 
        );
24 
}
25 

26 void Thread::join() {
27     if(_handle != 0
) {
28 
        WaitForSingleObject(_handle, INFINITE);
29 
        CloseHandle(_handle);
30         _handle = 0
;
31 
    }
32 
}
33 

34 unsigned __stdcall Thread::threadProc(void* param) {
35     Thread* p = static_cast<Thread*>
(param);
36     if (p->_target != 0
)
37         p->_target->
run();
38     else

39         p->run();
40     return 0
;
41 }

䏋颿˜¯æµ‹è¯•代ç ï¼š
test.cpp
 1 #include "thread.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 

 6 //½W¬ä¸€¿U方法,从Thread¾cÈ‘ôæ‰?/span>
 7 struct MyThread : public Thread {
 8     virtual void
 run() {
 9         for (int i = 0; i < 5; ++
i) {
10             cout << "MyThread Running..." << i <<
 endl;
11             Sleep(100
);
12 
        }
13 
    }
14 
};
15 

16 //½W¬äºŒ¿U方法,“实现â€Runnable接å£
17 struct MyRunnable : public Runnable {
18     virtual void
 run() {
19         for (int i = 0; i < 5; ++
i) {
20             cout << "MyRunnable Running..." << i <<
 endl;
21             Sleep(300
);
22 
        }
23 
    }
24 
};
25 

26 int main() {
27 

28     MyThread thread1;
29     Thread thread2(new
 MyRunnable());
30 
    thread1.start();
31 
    thread2.start();
32 
    thread1.join();
33 
    thread2.join();
34 

35     return 0;
36 }

å¯èƒ½çš„è¿è¡Œç»“果:
MyThread Running...0
MyRunnable Running...0
MyThread Running...1
MyThread Running...2
MyRunnable Running...1
MyThread Running...3
MyThread Running...4
MyRunnable Running...2
MyRunnable Running...3
MyRunnable Running...4


如果你熟悉boost库,你会知é“boost库的Thread构造函数å¯ä»¥æŽ¥å—æ™®é€šå‡½æ•°å’Œå‡½æ•°å¯¹è±¡ä½œäØ“å‚æ•°åQŒå¦‚果你觉得从Thread¾cÈ‘ô承或者实现Runnable接壘q˜ä¸å¤Ÿç®€‹z,下一½‹‡ä¼šæœ‰ä¸€ä¸ªæ¯”较好的改˜q›ã€?

]]>
考虑用Macro替æ¢Uncopyablehttp://m.shnenglu.com/ant/archive/2007/08/27/30908.html蚂蚾lˆç»“è€?/dc:creator>蚂蚾lˆç»“è€?/author>Mon, 27 Aug 2007 00:11:00 GMThttp://m.shnenglu.com/ant/archive/2007/08/27/30908.htmlhttp://m.shnenglu.com/ant/comments/30908.htmlhttp://m.shnenglu.com/ant/archive/2007/08/27/30908.html#Feedback2http://m.shnenglu.com/ant/comments/commentRss/30908.htmlhttp://m.shnenglu.com/ant/services/trackbacks/30908.html1. ž®†è¿™ä¸ªç±»çš„copy构造函数和copy assignmentæ“作½W¦éƒ½å£°æ˜Žä¸ºprivate而且没有定义。示例代ç å¦‚下:
1 class SomeClass {
2 
    ...
3 private
:
4     //åªæœ‰å£°æ˜Ž

5     SomeClass(const SomeClass&);
6     SomeClass& operator=(const SomeClass&
);
7 };

2. ä¸“é—¨è®¾è®¡ä¸€ä¸ªäØ“äº†é˜»æ­¢copying动作而设计的base classåQŒè¿™ä¸ªbase class相当½Ž€å•:
1 Uncopyable {
2 protected: //å…许derivedå¯¹è±¡æž„é€ å’Œæžæž„

3     Uncopyable() {}
4     ~
Uncopyable() {}
5 private: //é˜ÀL­¢copying

6     Uncopyable(const Uncopyable&);
7     Uncopyable& operator=(const Uncopyable&
);
8 };

ä¸ÞZº†é˜ÀL­¢æŸä¸ªå¯¹è±¡å¦‚SomeClass被copyingåQŒæˆ‘们唯一需è¦åšçš„就是ç‘ô承自UncopyableåQ?br />
1 SomeClass : private Uncopyable {
2 
    ...
3 };

½W?¿U方案貌似很完美åQŒåœ¨å¤§å¤šæ•°æƒ…况下也工作的很好åQŒç”šè‡³boost库也òq¿æ³›é‡‡ç”¨äº?boost库中的å«noncopyable)。当然了åQŒå› ä¸ºUncopyableä¸å«ä»ÖM½•æ•°æ®åQŒç¬¦åˆEBO(empty base class optimizationåQŒç©ºç™½åŸº¾cÀLœ€ä¼˜åŒ–)资格åQŒä½†ç”׃ºŽå®ƒæ€ÀL˜¯æ‰®æ¼”base classåQŒå› æ­¤æœ‰å¯èƒ½å¯ÆD‡´å¤šé‡¾l§æ‰¿åQŒè€ŒEBO一般åªåœ¨å•¾l§æ‰¿ä¸‹æ‰å¯è¡ŒåQŒç¼–译器通常ä¸ä¼šå¯ÒŽœ‰å¤šä¸ªbase classçš„derived classes施行EBOã€?br />
å¦‚æžœä½ ä¸æƒ›_¯¼è‡´å¤šé‡ç‘ô承,ä¸ç®¡æ˜¯ä»Žæ€§èƒ½ä¸Šè¿˜æ˜¯ä¹¦å†™ä»£ç ä¸ŠåQŒæ¯”如SomeClass¾l§æ‰¿è‡ªæŸä¸ªbase classåQŒä½ å¯èƒ½ä¼šå†™å¦‚下代ç åQ?br />
1 class SomeClass : public BaseClass, private Uncopyable {
2 
    ...
3 };

˜q™è®©äººå¾ˆä¸çˆ½åQŒè¦æ˜¯ä½ è·Ÿæˆ‘一æ äh‡’åQŒä½ è‚¯å®šä¹Ÿä¸ä¼šæ„¿æ„采用第一¿Uæ–¹æ¡ˆï¼Œå› äØ“é‚£æ„味ç€ä½ ä¼šåœ¨æ¯ä¸€ä¸ªä¸æƒŒ™¢«copyingçš„class里都加上那三行代ç ã€?br />
如果用Macrož®±å¾ˆ½Ž€å•了åQŒå³ç‰|´»åˆæ–¹ä¾¿ï¼š
1 #define CLASS_UNCOPYABLE(classname) \
2     private
: \
3     classname(const classname&
); \
4     classname& operator=(const classname&);

现在SomeClassåªéœ€å†™æˆ˜q™æ ·åQ?br />
1 class SomeClass {
2 
    CLASS_UNCOPYABLE(SomeClass)
3 
    ...
4 };

ä¸ä»…çœäº‹è€Œä¸”ç‰|´»åQï¼åQ?img src ="http://m.shnenglu.com/ant/aggbug/30908.html" width = "1" height = "1" />

]]>
¾Ã¾Ã¾Ã¾ÃÑÇÖÞav×ۺϲ¨¶àÒ°½áÒÂ| 9191¾«Æ·¹ú²úÃâ·Ñ¾Ã¾Ã| ÒÁÈ˾þôóÏãÏß½¹AV×ÛºÏÓ°Ôº| ¾Ã¾ÃÈËˬÈËÈËˬÈËÈËÆ¬AV| ¾Ã¾Ã¾ÃÇà²ÝÇàÇàÑÇÖÞ¹ú²úÃâ¹Û| ¾Ã¾Ã¹ú²úÊÓÆÁ| ÇàÇà²Ý¹ú²ú¾«Æ·¾Ã¾Ã| 2021¹úÄÚ¾«Æ·¾Ã¾Ã¾Ã¾Ã¾ÃÓ°Ôº| ¾Ã¾Ã¾«Æ·³ÉÈËÃâ·Ñ¿´| ¾Ã¾Ã¾Ã¾Ã¹ú²ú¾«Æ·ÈËÆÞ| 99¾Ã¾Ã¹ú²ú×ۺϾ«Æ·Âé¶¹| ¾Ã¾ÃÌìÌìÔêºÝºÝÔêÒ¹Ò¹avapp| ¾Ã¾Ã×ۺϾÅÉ«×ۺϾ«Æ·| ¾Ã¾Ã¾«Æ·Å·ÃÀÈÕº«¾«Æ·| ÈÕ²ú¾Ã¾ÃÇ¿¼éÃâ·ÑµÄ¿´| ¾Ã¾Ã¾Ã¾ÃÃâ·Ñ¾«Æ·¹ú²ú| ¹ú²ú¾«Æ·Ãâ·Ñ¸£Àû¾Ã¾Ã| 99¾Ã¾ÃÎÞÉ«ÂëÖÐÎÄ×ÖÄ»ÈËÆÞ | ¾Ã¾Ã¾«Æ·ÖÐÎÄ×ÖÄ»ÎÞÂëÂ̾ÞÈË| ¾Ã¾Ã¾«Æ·¹ú²úÑÇÖÞ¾«Æ·| É«×ۺϺϾþÃÌìÌì×ÛºÏÈÆÊÓ¿´| ¹ú²ú³ÉÈ˾«Æ·ÈýÉÏÓÆÑǾþÃ| ÑÇÖÞ¹ú²ú¾«Æ·È˾þÃ| ¹ú²úÎçÒ¹¾«Æ·ÀíÂÛÆ¬¾Ã¾ÃÓ°ÊÓ | 2019¾Ã¾Ã¾Ã¸ßÇå456| AAA¼¶¾Ã¾Ã¾Ã¾«Æ·ÎÞÂëÇø| ÇàÇàÇàÇà¾Ã¾Ã¾«Æ·¹ú²ú| ¾Ã¾Ã¾ÃÇà²Ý¾Ã¾Ã¾ÃÇà²Ý| ¾Ã¾ÃÑÇÖÞÅ·ÃÀÈÕ±¾¾«Æ·| Å·ÃÀ¾Ã¾Ã×ÛºÏÐÔÅ·ÃÀ| ÑÇÖÞÒ»ÇøÖÐÎÄ×ÖÄ»¾Ã¾Ã| ¾Ã¾Ã¾Ã¾Ã¾ÃÃâ·ÑÒ»Çø¶þÇøÈýÇø| ³ÉÈË×ÊÔ´Ó°ÒôÏÈ·æ¾Ã¾Ã×ÊÔ´Íø| ¾Ã¾Ã¾Ã¾Ã¹ú²ú¾«Æ·ÊìŮӰԺ| Ê츾ÈËÆÞ¾Ã¾ÃÖÐÎÄ×ÖÄ»| ÑÇÖÞva¾Ã¾Ã¾Ãàààààà¾Ã¾ÃÌìÌÃ| ¾Ã¾ÃÈË×öÈËË¬Ò»Çø¶þÇøÈýÇø | Ãâ·Ñ¹ú²ú99¾Ã¾Ã¾ÃÏã½¶| ¾Ã¾ÃÃâ·Ñ¹ú²ú¾«Æ·Ò»Çø¶þÇø| ÇàÇà²Ý¹ú²ú¾«Æ·¾Ã¾Ã¾Ã¾Ã| ¾Ã¾Ã¹ú²úÊÓÆÁ|