﻿<?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++博客-to myself 的分类学习日志-随笔分类-c++ programming</title><link>http://cppblog.com/toMyself/category/9700.html</link><description>做自己想做的事</description><language>zh-cn</language><lastBuildDate>Thu, 13 Aug 2015 10:38:50 GMT</lastBuildDate><pubDate>Thu, 13 Aug 2015 10:38:50 GMT</pubDate><ttl>60</ttl><item><title>线程间的通讯——Socket</title><link>http://www.cppblog.com/toMyself/archive/2014/11/25/208953.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 25 Nov 2014 03:06:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2014/11/25/208953.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/208953.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2014/11/25/208953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/208953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/208953.html</trackback:ping><description><![CDATA[Linux：<br />调用socketpair，create a pair of connected sockets。<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<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; ">int</span>&nbsp;g_notificationPipeFDs[2];<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getNotificationSendFD()<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;g_notificationPipeFDs[0];<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getNotificationRecvFD()<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;g_notificationPipeFDs[1];<br /><span style="color: #008080; ">11</span>&nbsp;}<br /><span style="color: #008080; ">12</span>&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;LogicThreadFunc(<span style="color: #0000FF; ">void</span>*&nbsp;args)<br /><span style="color: #008080; ">14</span>&nbsp;{<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;timeval&nbsp;timeout;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout.tv_sec&nbsp;=&nbsp;3;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout.tv_usec&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;value;<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(1)<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nfds&nbsp;=&nbsp;getNotificationRecvFD()&nbsp;+&nbsp;1;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd_set&nbsp;readfds;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_ZERO(&amp;readfds);<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_SET(getNotificationRecvFD(),&nbsp;&amp;readfds);<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret&nbsp;=&nbsp;select(nfds,&nbsp;&amp;readfds,&nbsp;NULL,&nbsp;NULL,&nbsp;&amp;timeout);<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ret&nbsp;&lt;&nbsp;0)<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("select");<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(0&nbsp;==&nbsp;ret)<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;timeout&nbsp;and&nbsp;do&nbsp;nothing.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(1)<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;recv(getNotificationRecvFD(),&nbsp;&amp;value,&nbsp;<span style="color: #0000FF; ">sizeof</span>(value),&nbsp;0);<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(len&nbsp;&gt;&nbsp;0)<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Recv:&nbsp;%d\n",&nbsp;value);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">54</span>&nbsp;<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;<br /><span style="color: #008080; ">56</span>&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;<br /><span style="color: #008080; ">59</span>&nbsp;<br /><span style="color: #008080; ">60</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;c,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**v)<br /><span style="color: #008080; ">61</span>&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(socketpair(AF_LOCAL,&nbsp;SOCK_STREAM,&nbsp;0,&nbsp;g_notificationPipeFDs)&nbsp;!=&nbsp;0)<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("socketpair");<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">67</span>&nbsp;<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;logicThreadId;<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret&nbsp;=&nbsp;pthread_create(&amp;logicThreadId,&nbsp;NULL,&nbsp;LogicThreadFunc,&nbsp;NULL);<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ret&nbsp;!=&nbsp;0)<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("fail&nbsp;to&nbsp;create&nbsp;thread&nbsp;1.\n");<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">75</span>&nbsp;<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;value;<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(1)<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cin&nbsp;&gt;&gt;&nbsp;value;<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Input:&nbsp;%d\n",&nbsp;value);<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;send(getNotificationSendFD(),&nbsp;&amp;value,&nbsp;<span style="color: #0000FF; ">sizeof</span>(value),&nbsp;0);<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(len&nbsp;!=&nbsp;<span style="color: #0000FF; ">sizeof</span>(value))<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("just&nbsp;send&nbsp;%d&nbsp;bytes.\n",&nbsp;len);<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">87</span>&nbsp;<br /><span style="color: #008080; ">88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">89</span>&nbsp;}</div><br /><br />参考 libevent的evutil_socketpair的实现。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; ">*&nbsp;Create&nbsp;two&nbsp;new&nbsp;sockets&nbsp;that&nbsp;are&nbsp;connected&nbsp;to&nbsp;each&nbsp;other.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;Unix,&nbsp;this&nbsp;simply&nbsp;calls&nbsp;socketpair().&nbsp;&nbsp;On&nbsp;Windows,&nbsp;it&nbsp;uses&nbsp;the<br />&nbsp;&nbsp;&nbsp;&nbsp;loopback&nbsp;network&nbsp;interface&nbsp;on&nbsp;127.0.0.1,&nbsp;and&nbsp;only<br />&nbsp;&nbsp;&nbsp;&nbsp;AF_INET,SOCK_STREAM&nbsp;are&nbsp;supported.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;(This&nbsp;may&nbsp;fail&nbsp;on&nbsp;some&nbsp;Windows&nbsp;hosts&nbsp;where&nbsp;firewall&nbsp;software&nbsp;has&nbsp;cleverly<br />&nbsp;&nbsp;&nbsp;&nbsp;decided&nbsp;to&nbsp;keep&nbsp;127.0.0.1&nbsp;from&nbsp;talking&nbsp;to&nbsp;itself.)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Parameters&nbsp;and&nbsp;return&nbsp;values&nbsp;are&nbsp;as&nbsp;for&nbsp;socketpair()<br /></span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">int</span>&nbsp;evutil_socketpair(<span style="color: #0000FF; ">int</span>&nbsp;d,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;type,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;protocol,&nbsp;evutil_socket_t&nbsp;sv[2]);</div><br />使用Socket实现进程间的通讯，与使用 &#8220;Mutex lock + Condition variable + 共享缓存区&#8221; 实现进程间的通讯的区别：<br /><ul><li>Socket方式：为了实现异步非阻塞地触发处理事件，一般需要把Recv端的socket加入到一个Reactor或Proactor。数据需要被拷贝。</li><li>Condition variable方式：在wait端需要死等，没有超时设置（？）。需要加锁。</li></ul><br /><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/208953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2014-11-25 11:06 <a href="http://www.cppblog.com/toMyself/archive/2014/11/25/208953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mutex and Condition variable</title><link>http://www.cppblog.com/toMyself/archive/2014/11/12/208856.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Wed, 12 Nov 2014 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2014/11/12/208856.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/208856.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2014/11/12/208856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/208856.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/208856.html</trackback:ping><description><![CDATA[<div>Mutex and Condition variable in Linux:</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;g_value&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;pthread_mutex_t&nbsp;g_pthread_mutex;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;pthread_cond_t&nbsp;g_pthread_cond;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;ThreadFunc1(<span style="color: #0000FF; ">void</span>*&nbsp;args)<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&amp;g_pthread_mutex);<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ThreadFunc1\n");<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_wait(&amp;g_pthread_cond,&nbsp;&amp;g_pthread_mutex);<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_value&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(2);<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ThreadFunc1:&nbsp;g_value=%d.\n",&nbsp;g_value);<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&amp;g_pthread_mutex);<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;<br /><span style="color: #008080; ">20</span>&nbsp;}<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;ThreadFunc2(<span style="color: #0000FF; ">void</span>*&nbsp;args)<br /><span style="color: #008080; ">24</span>&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&amp;g_pthread_mutex);<br /><span style="color: #008080; ">26</span>&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ThreadFunc2\n");<br /><span style="color: #008080; ">28</span>&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_signal(&amp;g_pthread_cond);<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_value&nbsp;=&nbsp;2;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(2);<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ThreadFunc2:&nbsp;g_value=%d.\n",&nbsp;g_value);<br /><span style="color: #008080; ">35</span>&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&amp;g_pthread_mutex);<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;<br /><span style="color: #008080; ">38</span>&nbsp;}</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**argv)<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pthread_mutex_init(&amp;g_pthread_mutex,&nbsp;NULL)&nbsp;!=&nbsp;0)<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("fail&nbsp;to&nbsp;initial&nbsp;thread&nbsp;mutex.\n");<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pthread_cond_init(&amp;g_pthread_cond,&nbsp;NULL)&nbsp;!=&nbsp;0)<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("fail&nbsp;to&nbsp;initial&nbsp;thread&nbsp;condition.\n");<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;thread1;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret&nbsp;=&nbsp;pthread_create(&amp;thread1,&nbsp;NULL,&nbsp;ThreadFunc1,&nbsp;NULL);<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ret&nbsp;!=&nbsp;0)<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("fail&nbsp;to&nbsp;create&nbsp;thread&nbsp;1.\n");<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">22</span>&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;thread2;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;pthread_create(&amp;thread2,&nbsp;NULL,&nbsp;ThreadFunc2,&nbsp;NULL);<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ret&nbsp;!=&nbsp;0)<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("fail&nbsp;to&nbsp;create&nbsp;thread&nbsp;2.\n");<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(thread1,&nbsp;NULL);<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(thread2,&nbsp;NULL);<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">35</span>&nbsp;}</div>输出：<br /><div>ThreadFunc1</div><div>ThreadFunc2</div><div>ThreadFunc2: g_value=2.</div><div>ThreadFunc1: g_value=1.</div><br />Mutex and Condition variable in Windows:<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->HANDLE&nbsp;<span style="color: #0000FF; ">event</span><br />CreateEvent<br />SetEvent<br />ResetEvent<br />WaitForSingleObject<br /><br />HANDLE&nbsp;mutex<br />CreateMutex<br />ReleaseMutex<br />WaitForSingleObject</div><div>注：Windows HANDLE类型可以为Event，Mutex，Process，Thread，Semaphore等。</div><br />说明：<br />1. C++在使用时，一般封装设计class Mutex，提供lock、unlock等函数，和设计class Monitor（boost::condition_variable_any），提供wait、notify等函数。<br /><img src ="http://www.cppblog.com/toMyself/aggbug/208856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2014-11-12 17:54 <a href="http://www.cppblog.com/toMyself/archive/2014/11/12/208856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CTime</title><link>http://www.cppblog.com/toMyself/archive/2012/05/02/173502.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Wed, 02 May 2012 10:57:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2012/05/02/173502.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/173502.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2012/05/02/173502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/173502.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/173502.html</trackback:ping><description><![CDATA[验证time_t值是否正确
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_0_18_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_18_Open_Text.style.display='none'; Codehighlighter1_0_18_Closed_Image.style.display='inline'; Codehighlighter1_0_18_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_18_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_18_Closed_Text.style.display='none'; Codehighlighter1_0_18_Open_Image.style.display='inline'; Codehighlighter1_0_18_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_18_Closed_Text">/**/</span><span id="Codehighlighter1_0_18_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;ctime&nbsp;example&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">time.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argv[])<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_113_405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_113_405_Open_Text.style.display='none'; Codehighlighter1_113_405_Closed_Image.style.display='inline'; Codehighlighter1_113_405_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_113_405_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_113_405_Closed_Text.style.display='none'; Codehighlighter1_113_405_Open_Image.style.display='inline'; Codehighlighter1_113_405_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_113_405_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_113_405_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(argc&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_134_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_192_Open_Text.style.display='none'; Codehighlighter1_134_192_Closed_Image.style.display='inline'; Codehighlighter1_134_192_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_134_192_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_134_192_Closed_Text.style.display='none'; Codehighlighter1_134_192_Open_Image.style.display='inline'; Codehighlighter1_134_192_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_134_192_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_134_192_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Usage:&nbsp;%s&nbsp;sec\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;argv[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">14</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /></span><span style="color: #008080">15</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;time_t&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(time_t)atoi(argv[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;printf&nbsp;(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;input's&nbsp;local&nbsp;time&nbsp;is:&nbsp;%s\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;ctime(</span><span style="color: #000000">&amp;</span><span style="color: #000000">t)&nbsp;);<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;time_t&nbsp;rawtime;<br /></span><span style="color: #008080">20</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">struct&nbsp;tm&nbsp;*&nbsp;ptm;<br /></span><span style="color: #008080">21</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /></span><span style="color: #008080">22</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">time&nbsp;(&nbsp;&amp;rawtime&nbsp;);<br /></span><span style="color: #008080">23</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ptm&nbsp;=&nbsp;gmtime&nbsp;(&nbsp;&amp;rawtime&nbsp;);</span><span style="color: #008000"><br /></span><span style="color: #008080">24</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/173502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2012-05-02 18:57 <a href="http://www.cppblog.com/toMyself/archive/2012/05/02/173502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ programming reference</title><link>http://www.cppblog.com/toMyself/archive/2011/07/04/150119.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 04 Jul 2011 06:57:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2011/07/04/150119.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/150119.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2011/07/04/150119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/150119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/150119.html</trackback:ping><description><![CDATA[<div>《Effective C++中文第三版》 【美】 Scott Meyers 著&nbsp;&nbsp;&nbsp; 侯捷&nbsp; 译<br /><br />《More Effective C++》<br /><br />《高质量程序设计指南--C++/C语言（第3版）》 林锐 韩永泉 编著&nbsp; <br /><br />
<p>C++ 是一门难学易用的语言！</p>
<p>C++ 的难学，不仅在其广博的语法、语法背后的语义、语义背后的深层思维、深层思维背后的对象模型；C++ 的难学，还在于它提供了4种不同（相辅相成）的编程思维模型：procedural-based，object-based，object-oriented，generic paradigm。</p>
<p>世上没有白吃的午餐。又要有效率，又要有弹性，又要前瞻望远，又要回溯相容，又要能治大国，又要能烹小鲜，学习起来当然就不可能太简单。</p>
<p>在如此庞大复杂的机制下，万千使用者前赴后继的动力是：一旦学成，妙用无穷。</p>
<div>C++相关书籍车载斗量，如天上繁星，如果过江之鲫。</div>
<div>广博如四库全书者有之（The C++ Programming Language、C++ Primer、Thinking in C++），</div>
<div>深奥如重山复水者有之（The Annotated C++ Reference Manual, Inside the C++ Object Model），</div>
<div>细说历史者有之（The Design and Evolution of C++, Ruminations on C++），</div>
<div>独沽一味者有之（Polymorphism in C++），</div>
<div>独树一帜者有之（Design Patterns, Large Scale C++ Software Design, C++ FAQs）,<br />另辟蹊径者有之（Generic Programming and the STL），<br /></div>
<div>程序库大全有之（The C++ Standard Library），</div>
<div>专家经验之累积亦有之（Effective&nbsp;C++, More Effective C++, Exceptional C++）。</div>
<div>
<p>这其中，"工程经验之累积"对已具 C++ 相当基础的程序员而言，有着致命的吸引力与立竿见影的帮助，其特色是轻薄短小，高密度地纳入作者浸淫于 C++/OOP 多年而广泛的经验。它们不但开扩读者的视野，也为读者提供各种 C++/OOP 常见问题的解决模型。某些小范围主题诸如"在base classes 中使用 virtual destructor"、"令operator= 传回 *this 的 reference"，可能在百科型 C++ 语言书籍中亦曾概略提过，但此类书籍以深度探索的方式，让我们了解问题背后的成因、最佳的解法，以及其他可能的牵扯。至于大范围主题，例如smart pointers，reference counting，proxy classes，double dispatching，基本上已属design patterns的层级！</p></div>
<p>&nbsp;</p>c++经典书籍<br />原文：<a href="http://blog.163.com/yujishui2887090@126/blog/static/217925202007101692235256/">http://blog.163.com/yujishui2887090@126/blog/static/217925202007101692235256/</a><br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这几本让读者和我在期待的C/C++巨著就是这期我要推荐的&#8212;&#8212;《Essential C++中文版》、《Effective C++中文版》、《The C++ Programming Language》和《C++ Primer》。 
<p style="text-indent: 2em">　　Essential C++（Addison Wesley Pub Co.，1999年10月第一版）的作者Stanley B. Lippman更是C++领域一流的大师级人物，他从1984年开始就与C++结下了不解之缘：参与了第一个C++编译器C Front的开发，曾经和C++之父Bjarne Stroustrup（详见下）一起在贝尔实验室的项目组工作、负责研究C++程序开发环境中的对象模型，后来又担任著名的C++Report杂志编辑，此后他到迪斯尼旗下的梦工厂出任软件技术总监（Software Technology Director），主要著述有Essential C++、C++Primer、C++Gems、Inside the C++ Object Model、C＃Primer等，关于作者的更详细信息可以到其个人网站（<a href="http://www.objectwrite.com/">http://www.objectwrite.com/</a>，该网址笔者已验证无误）查询。</p>
<p style="text-indent: 2em">　　Lippman当前在业界的影响力可以从最近发生的一件事情看出：不久前微软已经邀请了C++编程语言的先驱Stanley B. Lippman加盟它的Visual C++.Net开发小组，以打消广大的C++编程人员的疑虑。</p>
<p style="text-indent: 2em">　　Essential C++是Lippman在C++ Primer之后的著作，可以说是厚积薄发的精髓之作。不要想当然地觉得这本书只有276页就是烹小鲜的入门向导&#8212;&#8212;其实，我到觉得如果想通过一本书入门，1237页的C++ Primer或1109页的The C++ Programming Language更加适合。</p>
<p style="text-indent: 2em">　　Essential C++分为7个章节，分别是C++基础、面向过程的编程风格、泛型编程风格、基于对象的编程风格、面向对象的编程风格、运用模板编程和异常处理。从结构的安排上我们可以看出作者的深意所在：并不是要手把手地教你键入和编译调试一个类似&#8220;Hello World&#8221;的程序，而是要一步一步地教会读者通过函数、指针、模板、类等构件形成一套完整的编程思想，在不同的需求情况下能够自如地使用面向过程或面向对象的方法进行程序设计，正如Bjarne Stroustrup在The C++ Programming Language一书中引用Kristen Nygaard（Simula语言的两位创造者之一）所说的&#8220;Programming is understanding&#8221;。</p>
<p style="text-indent: 2em">　　如果你是一个新手，在阅读本书的时候不要忘了找一本更详细一些的参考教材&#8212;&#8212;作者只用了30页的篇幅讲C++变成的基础知识，这里面还包括了数组、向量和指针等内容，《Essential C++中文版》（华中科技大学出版社，2001年8月第一版）已经出版，是侯捷的译著&#8212;&#8212;恐怕业内很少有人不知道这位台湾大名鼎鼎电脑教育作家，建立在深刻理解基础上的翻译质量几乎可以说是无可挑剔了，但对于一些词汇的翻译方法和大陆翻译习惯的差异还有待磨合和改进（虽然译者坚持保留其繁体版译法）。 </p>
<p style="text-indent: 2em">　　Effective C++（Addison Wesley Pub Co.，1997年9月第二版）没有教你C++语法或函数、对象、模板之类的东西，这是一本风格独到的经典技巧集，曾经获得过1992年度Jolt Award and Productivity Awards，作者教给你的是50个&#8220;改善程序技术与设计思维&#8221;的特别途径。</p>
<p style="text-indent: 2em">　　Scott Meyers是C++业界公认的权威，主要从事软件开发咨询工作，活跃在全球各技术研讨会上，同时是C++ Report的重要专栏作家，知名著述出了Effective C++之外还有More Effective C++和Effective STL等，关于作者的更详细信息可以到其个人网站（<a href="http://www.aristeia.com/">http://www.aristeia.com/</a>）查询。</p>
<p style="text-indent: 2em">　　《Effective C++中文版》（华中科技大学出版社，2001年9月第一版）也已经在国内翻译出版，译者还是侯捷。当你初步了解C++的全貌之后，Effective C++能够在短时间内大幅度地提高你C++编程的水平，此书的独特之处在于每一个你遇到的C++问题，Meyers都好像未卜先知地放在了书里，所有让你困惑的问题你几乎都可以在这本书中找到精辟的论述&#8212;&#8212;如果能加Meyers的另一本巨著More Effective C++（Addison Wesley Pub Co.，1995年12月第一版）将更会锦上添花。</p>
<p style="text-indent: 2em">　　本书在结构上分为改变旧有的C习惯、内存管理、构造析构函数与作业运算符、类与函数的设计和声明、类与函数的实现、继承关系与面向对象设计以及杂项讨论7个部分。很多人都认为你越熟悉C语言或其他面向过程的语言，在学习面向对象的语言的时候就会面临更大的困难，的确，如果你已经习惯了面向过程，在面向对象的时候你还是无法忘记过程，为此，Meyers在第一部分就提出了改变旧有的C习惯，通过几个小技巧让你能够尽量不受原有知识对新知识学习的干扰。</p>
<p style="text-indent: 2em">　　在接下来的3个部分中，作者又针对让人头疼的内存管理问题（Java就宣称采用自动内存管理减少了编程复杂程度和出错几率是比C++的一大进步），随后，作者针对函数与类的构造析构、设计、实现等问题进行了详实的讨论，没有枯燥的长篇大论，都是结合实例的分析讲解&#8212;&#8212;如果你刚学C++不久但已经可以独立编写一些简单的程序，你会发现所有被批判的问题程序中都可以找到自己的影子，这真是一件奇妙的事情！</p>
<p style="text-indent: 2em">　　在&#8220;继承关系与面向对象设计&#8221;部分里作者没有喋喋不休地去讨论尚有争议的问题，而是把精力放在最基础的理念上，澄清了C++中类的继承体系设计与实现，并结合继承问题阐释了OOP。&#8220;杂项讨论&#8221;中作者主要讨论了编译、标准库等问题。</p>
<p style="text-indent: 2em">　　打一个粗俗些的比方：Effec tiv e C++和M o re Effec tiv e C++就像是C++学习者的手挠，每一下都抓在你的痒处。</p>
<p style="text-indent: 2em">　　The C++ Programming Language（Addison Wesley Pub Co.，2000年2月第三版，高等教育出版社，2001年8月影印版）是无论哪一个C++学习者绝对、绝对不能错过的头号经典。</p>
<p style="text-indent: 2em">　　Rogue Wave公司（Boland C++ Builder中STL方案的提供商）的Nathan Myers说：&#8220;15年之后，此书仍然是唯一一本无可替代的C++书籍。&#8221;只要有人推荐C++书籍，此书必在其中。正如侯捷先生1999年C++Primer繁体版前言中评价所说：&#8220;C++/OOP的领域极广&#8230;&#8230;，不同的切入角度，都存在不同的经典好书。但如果考量的是语言全貌性（百科型）书籍，从来我只推荐两本，一是Bjarne Stroustrup的The C++ Programming Language，另一是Stanley B.Lippman的C++ Primer。这么说难免遗珠之憾，但是泰山北斗已现，又何必案牍劳形于墨瀚书海之中！这两本书都从C++盘古开天以来，一路改版，斩将搴旗，追奔逐北，成就一身荣光&#8221;。</p>
<p style="text-indent: 2em">　　作者Bjarne Stroustrup是贝尔实验室大规模程序设计研究部门（Large-Scale Programming Research Department）负责人，AT&amp;T、ACM成员，主要著述有The C++ Programming Language、The Design and Evolution of C++、The Annotated C++ Reference Manual、C++ In-Depth Box Set（与别人合著）等。</p>
<p style="text-indent: 2em">　　1979年Stroustrup开始开发一种语言，当时称为&#8220;C with Class&#8221;，后来演化为C++，并于1995年在贝尔实验室研制成功并投入使用的，Stroustrup也被称为&#8220;C++之父&#8221;，关于作者的更详细信息可以到其个人网站（<a href="http://www.research.att.com/~bs/homepage.html">http://www.research.att.com/~bs/homepage.html</a>）查询。</p>
<p style="text-indent: 2em">　　1998年，ANSI/ISOC++标准建立，同年，Strousturp推出了其经典著作The C++Programming Language的第三版。The C++Programming Language可是说非常全面、权威，充满了技术性极强的材料，很多地方值得反复回味与思索。</p>
<p style="text-indent: 2em">　　Stroustrup说，他所接触和开发的软件无论是在大小、复杂性和难度来说，根本不是外界一般软件所能比拟的。本书虽然是一本计算机编程语言教程，但是处处体现出他对于软件开发和程序设计的看法。所以他在书中的很多观点虽然看上去不觉得有什么了不起的地方，但是当你面临到真正挑战的时候，就会深刻体会到其真知灼见非同一般。即便我们不考虑语言的障碍，这本书仍然比较难懂，作者很多地方点到即止，其中深意不是初学者能够真正领会的。</p>
<p style="text-indent: 2em">　　这本书有个绰号&#8212;&#8212;C++专家自学指南，也就是你必须先是专家，然后再来读此书自学提高。 </p>
<p style="text-indent: 2em">　　C++ Primer是Lippman的成名大作&#8212;&#8212;不要看到这个名字就真认为这是&#8220;C++的初级读本&#8221;，实际上它是一本标准的&#8220;从入门到精通&#8221;教材，目前该书的简体中文版还没有上市，我到处寻找其英文版也没能如愿，一个偶然的机会在朋友那里看到了侯捷（见上关于此书的评价）繁体中文版的C++Primer，大体翻看了一下，感觉此书在实例方面非常详尽，内容可谓是全面、权威，通俗易懂。</p>
<p style="text-indent: 2em">　　初学者只要能够认真学通这本书，足以能自由使用C++编写程序，成为C++的高手。C++ Primer对标准C++提供了广泛的介绍，提供了一个思考性的C++学习方案，C++中的重要该概念诸如异常处理、容器类型、面向对象的程序设计等等都体现在字里行间，对语言规则也进行了深入地探讨，是一本非常好的入门也是提高的教程和参考。</p>
<p style="text-indent: 2em">　　全书共分为20章，从C++最基本的元素、数据类型到面向过程的程序设计到泛型算法到基于对象与面向对象的程序设计等等，洋洋洒洒，蔚为大观。此书将由中国电力出版社近期推出简体中文版，由潘爱民（《COM原理与应用》的作者，《Visual C++技术内幕（第四版）》、《深入理解COM+》、《COM本质论》、《深入解析ATL》的译者）主译。</p><br /><br /><br /></div><img src ="http://www.cppblog.com/toMyself/aggbug/150119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2011-07-04 14:57 <a href="http://www.cppblog.com/toMyself/archive/2011/07/04/150119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ pointer (the second)</title><link>http://www.cppblog.com/toMyself/archive/2010/12/14/136402.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 14 Dec 2010 10:33:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/12/14/136402.html</guid><description><![CDATA[简单例子：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;tt<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;foo(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x)&nbsp;{&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,x);&nbsp;}<br>};<br><br>typedef&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">　(&nbsp;tt::</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FUNCTYPE)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;);<br>FUNCTYPE&nbsp;ptr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tt::foo;　</span><span style="color: #008000;">//</span><span style="color: #008000;">给一个成员函数指针赋值.</span><span style="color: #008000;"><br></span><span style="color: #000000;">tt&nbsp;a;<br>(a.</span><span style="color: #000000;">*</span><span style="color: #000000;">ptr)(</span><span style="color: #000000;">5</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">调用成员函数指针.</span><span style="color: #008000;"><br></span><span style="color: #000000;">tt&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;tt;<br>(b</span><span style="color: #000000;">-&gt;*</span><span style="color: #000000;">ptr)(</span><span style="color: #000000;">6</span><span style="color: #000000;">);　</span><span style="color: #008000;">//</span><span style="color: #008000;">调用成员函数指针.</span></div>
<br>men_fun与mem_fun_ref
<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: #000000;">#include</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: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">functional</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">algorithm</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bitset</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Fun()<br>{<br>&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">Fun</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&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>}<br>};<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main()<br>{<br>vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">A</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">&nbsp;vectA;<br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">3</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;A&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;A;<br>&nbsp;&nbsp;&nbsp;vectA.push_back(a);<br>}<br>for_each(vectA.begin(),vectA.end(),mem_fun(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">A::Fun));</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;mem_fun_ref的作用和用法跟mem_fun一样，唯一的不同就是：当容器中存放的是对象实体的时候用mem_fun_ref，当容器中存放的是对象的指针的时候用mem_fun。</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>}<br>我们把men_fun与mem_fun_ref理解为函数绑定器就够了！！</span></div>
<br><br>模板成员函数
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Obj<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;display(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;val1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;val1&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;val2&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Obj&nbsp;obj;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;str(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hello&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;obj.display(str,&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>}&nbsp;</span></div>
<br><br>C++模板实现事件处理器中的&#8220;通用成员函数指针&#8221;的调用<br>参考：<br>http://www.cnblogs.com/Xiao_bird/archive/2009/07/03/1516441.html
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;FuncCaller<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&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;func_call(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;obj_ptr,&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;param)</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>};<br><br>template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;FuncItem&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;FuncCaller<br>{<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;(T::</span><span style="color: #000000;">*</span><span style="color: #000000;">HandlerPtr)(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;param);<br>&nbsp;&nbsp;&nbsp;&nbsp;HandlerPtr&nbsp;handler;&nbsp;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;func_call(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;obj_ptr,&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;param)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">obj_ptr&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(((T</span><span style="color: #000000;">*</span><span style="color: #000000;">)obj_ptr)</span><span style="color: #000000;">-&gt;*</span><span style="color: #000000;">handler)(param);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;FuncItem(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;HandlerPtr&nbsp;ptr):handler(ptr)&nbsp;{}&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;此处为新添加代码</span><span style="color: #008000;"><br></span><span style="color: #000000;">};<br><br><br>typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_EventRegister<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;EventType&nbsp;</span><span style="color: #0000ff;">event</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;FuncCaller</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;func_caller;<br>}&nbsp;EventRegister;<br><br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ClassA<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;show_me(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;param)<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;ClassA,&nbsp;show_me&nbsp;is&nbsp;called!&nbsp;param&nbsp;is&nbsp;0x%x\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;param);&nbsp;}<br>};<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ClassB<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;come_on(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;param)<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">I'm&nbsp;ClassB,&nbsp;come_on&nbsp;is&nbsp;called!&nbsp;param&nbsp;is&nbsp;0x%x</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;param);&nbsp;}<br>};<br><br><br>EventRegister&nbsp;event_center[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;EVENT_TEST_1&nbsp;&nbsp;,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FuncItem</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ClassA</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ClassA::show_me)&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;EVENT_TEST_2&nbsp;&nbsp;,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FuncItem</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ClassB</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ClassB::come_on)&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;EVENT_INVALID&nbsp;,&nbsp;NULL&nbsp;}<br>};<br><br><br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br>&nbsp;*&nbsp;Function:send_event<br>&nbsp;*&nbsp;params:<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event&nbsp;-&gt;&nbsp;event&nbsp;type<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;-&gt;&nbsp;who&nbsp;will&nbsp;process&nbsp;the&nbsp;event<br>&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;send_event(EventType&nbsp;</span><span style="color: #0000ff;">event</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;target,&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;param)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">target&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;loop_event&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;EventType&nbsp;et&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;event_center[loop_event].</span><span style="color: #0000ff;">event</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(&nbsp;et</span><span style="color: #000000;">!=</span><span style="color: #000000;">EVENT_INVALID&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;et</span><span style="color: #000000;">==</span><span style="color: #0000ff;">event</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event_center[loop_event].func_caller</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">func_call(target,&nbsp;param);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;et&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;event_center[</span><span style="color: #000000;">++</span><span style="color: #000000;">loop_event].</span><span style="color: #0000ff;">event</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br><br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;ClassA&nbsp;ca;<br>&nbsp;&nbsp;&nbsp;&nbsp;ClassB&nbsp;cb;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;send_event(EVENT_TEST_1,&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ca,&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">0xff00</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;send_event(EVENT_TEST_2,&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cb,&nbsp;NULL);<br>}<br></span></div>
<br><br>&nbsp;boost::bind
<br>参考：<br>1，http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Foo<br>{<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;methodA();<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;methodInt(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a);<br>};<br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Bar<br>{<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;methodB();<br>};<br><br>boost::function</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">()</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;f1;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;无参数，无返回值</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>Foo&nbsp;foo;<br>f1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;boost::bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Foo::methodA,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">foo);<br>f1();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;调用&nbsp;foo.methodA();</span><span style="color: #008000;"><br></span><span style="color: #000000;">Bar&nbsp;bar;<br>f1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;boost::bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Bar::methodB,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">bar);<br>f1();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;调用&nbsp;bar.methodB();</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>f1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;boost::bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Foo::methodInt,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">foo,&nbsp;</span><span style="color: #000000;">42</span><span style="color: #000000;">);<br>f1();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;调用&nbsp;foo.methodInt(42);</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>boost::function</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;f2;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;int&nbsp;参数，无返回值</span><span style="color: #008000;"><br></span><span style="color: #000000;">f2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;boost::bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Foo::methodInt,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">foo,&nbsp;_1);<br>f2(</span><span style="color: #000000;">53</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;调用&nbsp;foo.methodInt(53);</span></div>
<br><br><img src ="http://www.cppblog.com/toMyself/aggbug/136402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-12-14 18:33 <a href="http://www.cppblog.com/toMyself/archive/2010/12/14/136402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>class base and derived</title><link>http://www.cppblog.com/toMyself/archive/2010/11/12/133455.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Fri, 12 Nov 2010 12:07:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/11/12/133455.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/133455.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2010/11/12/133455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/133455.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/133455.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: #008000;">//</span><span style="color: #008000;">&nbsp;base.h</span><span style="color: #008000;"><br></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Base<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Base()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Base::Base</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">Base()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Base::~Base</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&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;Init()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Base::Init</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&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;Final()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Base::Final</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&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()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Base::Print</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Call()&nbsp;{&nbsp;Print();&nbsp;}<br>};</span></div>
<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: #008000;">//</span><span style="color: #008000;">&nbsp;derived.h</span><span style="color: #008000;"><br></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">base.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Derived&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Base<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Derived()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Derived::Derived</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">Derived()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Derived::~Derived</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&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;Init()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Derived::Init</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&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;Final()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Derived::Final</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>&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()&nbsp;{&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Derived::Print</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;&nbsp;}<br>};</span></div>
<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: #008000;">//</span><span style="color: #008000;">&nbsp;main.cpp</span><span style="color: #008000;"><br></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">derived.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pD&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Derived();<br>&nbsp;&nbsp;&nbsp;&nbsp;pD</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Init();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;pD</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Call();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;pD</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Final();<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pD;<br>&nbsp;&nbsp;&nbsp;&nbsp;pD&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br><br>&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>}<br></span></div>
<br><span style="color: #000000;">Results:</span><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: #000000;">Base::Base<br>Derived::Derived<br>Derived::Init<br>Derived::Print<br>Derived::Final<br>Base::~Base</span></div>
<br><br>若在Base的构造函数里调用Call()，那么将打印：&#8220;Base::Print
&#8220;，这是因为Base在构造的时候，Derived本身还没有构造好。<br><br><br><br> <img src ="http://www.cppblog.com/toMyself/aggbug/133455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-11-12 20:07 <a href="http://www.cppblog.com/toMyself/archive/2010/11/12/133455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ pointer</title><link>http://www.cppblog.com/toMyself/archive/2010/09/17/126852.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Fri, 17 Sep 2010 03:56:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/09/17/126852.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、数据指针#include&nbsp;&lt;iostream&gt;struct&nbsp;MyStruct{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;key;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;value;};int&nbsp;sum(My...&nbsp;&nbsp;<a href='http://www.cppblog.com/toMyself/archive/2010/09/17/126852.html'>阅读全文</a><img src ="http://www.cppblog.com/toMyself/aggbug/126852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-09-17 11:56 <a href="http://www.cppblog.com/toMyself/archive/2010/09/17/126852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编码风格</title><link>http://www.cppblog.com/toMyself/archive/2010/08/28/125074.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Sat, 28 Aug 2010 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/08/28/125074.html</guid><description><![CDATA[&nbsp; 
<h1 align="left"><span>文件包含的名字和顺序</span></h1>
<p align="left"><span>请使用以下标准顺序以保证可读性，并且避免隐藏的依赖：</span><span>C</span><span>库，</span><span>C++</span><span>库，其他库的</span><span>.h</span><span>，你的项目的</span><span>.h</span><span>。</span></p>
<p align="left"><span>所有项目的头文件应作为项目源文件目录的后代列出，不要使用</span><span>UNIX</span><span>中的目录快捷方式</span><span> . (</span><span>当前目录）和</span><span> .. (</span><span>父目录）。</span></p>
<p align="left"><span>举个例子，</span><span>google-awesome-project/src/base/logging.h</span><span>应该以</span><span>#include "base/logging.h"</span><span>的格式包含。</span></p>
<p align="left"><span>在</span><span> dir/foo.cc</span><span>中，该文件的主要目的是实现或者测试在</span><span>dir2/foo2.h</span><span>中的东西，文件包含应按照如下排序：</span></p>
<p align="left"><span>1.<span>&nbsp;&nbsp;&nbsp; </span></span><span>dir2/foo2.h (</span><span>首选位置</span><span>(preferred location) &#8212; </span><span>请见下面的详细说明</span><span>). </span></p>
<p align="left"><span>2.<span>&nbsp;&nbsp;&nbsp; </span></span><span>C system files. </span></p>
<p align="left"><span>3.<span>&nbsp;&nbsp;&nbsp; </span></span><span>C++ system files. </span></p>
<p align="left"><span>4.<span>&nbsp;&nbsp;&nbsp; </span></span><span>Other libraries' .h files. </span></p>
<p align="left"><span>5.<span>&nbsp;&nbsp;&nbsp; </span></span><span>Your project's .h files. </span></p>
<p align="left"><span>首选的排序（</span><span>preferred ordering</span><span>，译者注：在以上例子中为</span><span>dir2/foo2.h </span><span>）降低了隐藏的依赖。我们希望每个头文件能够自我编译。最简单的方式就是确保它们中的每一个都在某个</span><span>.cc</span><span>文件中是第一个被</span><span>#include</span><span>的。</span></p>
<p align="left"><span>dir/foo.cc and dir2/foo2.h</span><span>通常在同一目录下（比</span><span> </span><span>如</span><span>base/basictypes_unittest.cc and base/basictypes.h</span><span>），</span><span> </span><span>但也可能在不同的目录下。</span></p>
<p align="left"><span>在每个部分</span><span>(section)</span><span>中，根据字母顺序排列是不错的方式。</span></p>
<p align="left"><span>举个例子，</span><span>google-awesome-project/src/foo/internal/fooserver.cc</span><span>中</span><span> </span><span>的文件包含顺</span><span> </span><span>序可能是这样：</span></p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<p align="left"><span>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10</span></p></td>
<td>
<p align="left"><em><span>#include "foo/public/fooserver.h" // </span></em><em><span>首选位置</span></em><em><span><br />#include &lt;sys/types.h&gt;<br />#include &lt;unistd.h&gt;<br /><br />#include &lt;hash_map&gt;<br />#include &lt;vector&gt;<br /><br />#include "base/basictypes.h"<br />#include "base/commandlineflags.h"<br />#include "foo/public/bar.h"</span></em></p></td></tr></tbody></table><br /><br />参考：<br />1， Google C++ Style Guide：<a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml</a><br />2， Google C++ 风格指南 - 中文版：<a href="http://yangyubo.com/google-cpp-styleguide/">http://yangyubo.com/google-cpp-styleguide/</a><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/125074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-08-28 20:59 <a href="http://www.cppblog.com/toMyself/archive/2010/08/28/125074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异常处理</title><link>http://www.cppblog.com/toMyself/archive/2010/04/23/113312.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Fri, 23 Apr 2010 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/04/23/113312.html</guid><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">exception</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"><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"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;SystemException&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;std::exception<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"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Construct&nbsp;with&nbsp;a&nbsp;specific&nbsp;context&nbsp;and&nbsp;error&nbsp;code.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #000000">SystemException(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;context,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;code)<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;mContext(context),<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mCode(code)<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Copy&nbsp;constructor.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #000000">SystemException(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;SystemException</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;e)<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std::exception(e),<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mContext(e.mContext),<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mCode(e.mCode)<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">{<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: #808080">///</span><span style="COLOR: #008000">&nbsp;Destructor.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">SystemException()&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">&nbsp;()<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Assignment&nbsp;operator.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #000000">SystemException</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;SystemException</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;e)<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;&nbsp;&nbsp;&nbsp;mContext&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;e.mContext;<br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mCode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;e.mCode;<br></span><span style="COLOR: #008080">32</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<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"></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Get&nbsp;a&nbsp;string&nbsp;representation&nbsp;of&nbsp;the&nbsp;exception.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">35</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;what()&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">&nbsp;()<br></span><span style="COLOR: #008080">36</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">37</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mContext.c_str();<br></span><span style="COLOR: #008080">38</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">39</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Get&nbsp;the&nbsp;implementation-defined&nbsp;context&nbsp;associated&nbsp;with&nbsp;the&nbsp;exception.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">40</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;Context()&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">41</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">42</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mContext;<br></span><span style="COLOR: #008080">43</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">44</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Get&nbsp;the&nbsp;implementation-defined&nbsp;code&nbsp;associated&nbsp;with&nbsp;the&nbsp;exception.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">45</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Code()&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">46</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">47</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mCode;<br></span><span style="COLOR: #008080">48</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">49</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">50</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;context&nbsp;associated&nbsp;with&nbsp;the&nbsp;error.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">51</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;mContext;<br></span><span style="COLOR: #008080">52</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;code&nbsp;associated&nbsp;with&nbsp;the&nbsp;error.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">53</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mCode;<br></span><span style="COLOR: #008080">54</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">55</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">56</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Output&nbsp;the&nbsp;string&nbsp;associated&nbsp;with&nbsp;a&nbsp;system&nbsp;exception.</span><span style="COLOR: #808080"><br></span><span style="COLOR: #008080">57</span>&nbsp;<span style="COLOR: #808080"></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">58</span>&nbsp;<span style="COLOR: #008000">*&nbsp;Used&nbsp;to&nbsp;output&nbsp;a&nbsp;human-readable&nbsp;string&nbsp;that&nbsp;is&nbsp;associated&nbsp;with&nbsp;a&nbsp;system<br></span><span style="COLOR: #008080">59</span>&nbsp;<span style="COLOR: #008000">*&nbsp;exception.<br></span><span style="COLOR: #008080">60</span>&nbsp;<span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">61</span>&nbsp;<span style="COLOR: #008000">*&nbsp;@param&nbsp;os&nbsp;The&nbsp;output&nbsp;stream&nbsp;to&nbsp;which&nbsp;the&nbsp;string&nbsp;will&nbsp;be&nbsp;written.<br></span><span style="COLOR: #008080">62</span>&nbsp;<span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">63</span>&nbsp;<span style="COLOR: #008000">*&nbsp;@param&nbsp;e&nbsp;The&nbsp;exception&nbsp;to&nbsp;be&nbsp;written.<br></span><span style="COLOR: #008080">64</span>&nbsp;<span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">65</span>&nbsp;<span style="COLOR: #008000">*&nbsp;@return&nbsp;The&nbsp;output&nbsp;stream.<br></span><span style="COLOR: #008080">66</span>&nbsp;<span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">67</span>&nbsp;<span style="COLOR: #008000">*&nbsp;@relates&nbsp;boost::asio::SystemException<br></span><span style="COLOR: #008080">68</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">69</span>&nbsp;<span style="COLOR: #000000">template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;Ostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">70</span>&nbsp;<span style="COLOR: #000000">Ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(Ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;os,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;SystemException</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;e)<br></span><span style="COLOR: #008080">71</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">72</span>&nbsp;<span style="COLOR: #000000">os&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;e.what();<br></span><span style="COLOR: #008080">73</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;os;<br></span><span style="COLOR: #008080">74</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">75</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">76</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">77</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">78</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">79</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">80</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">81</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">&nbsp;SystemException(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A&nbsp;system&nbsp;error!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">82</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">83</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(std::exception</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;e)<br></span><span style="COLOR: #008080">84</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">85</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Exception1:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;e.what()&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">86</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">87</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;e)<br></span><span style="COLOR: #008080">88</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">89</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Exception2:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;e.c_str()&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">90</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">91</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(<img src="http://www.cppblog.com/Images/dot.gif">)<br></span><span style="COLOR: #008080">92</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">93</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">catch&nbsp;a&nbsp;exception&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">94</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">95</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">96</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">end&nbsp;main</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">97</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">98</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">99</span>&nbsp;<span style="COLOR: #000000"></span></div>
<img src ="http://www.cppblog.com/toMyself/aggbug/113312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-04-23 10:54 <a href="http://www.cppblog.com/toMyself/archive/2010/04/23/113312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++设置</title><link>http://www.cppblog.com/toMyself/archive/2009/09/15/96246.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 15 Sep 2009 09:35:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2009/09/15/96246.html</guid><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: #000000;">修改工程的Working&nbsp;Directory&nbsp;为：$(OutDir)</span></div>
<br> <img src ="http://www.cppblog.com/toMyself/aggbug/96246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2009-09-15 17:35 <a href="http://www.cppblog.com/toMyself/archive/2009/09/15/96246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态库与动态库</title><link>http://www.cppblog.com/toMyself/archive/2009/03/06/75736.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Fri, 06 Mar 2009 05:57:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2009/03/06/75736.html</guid><description><![CDATA[静态编译的lib；动态dll的lib，只是一些符号导入库。<br>LIB有两种,一种是静态库,比如C-Runtime库,这种LIB中有函数的实现代码,一般用在静态连编上,它是将LIB中的代码加入EXE文件中,所以编译好了之后,LIB文件就没有了.一种LIB是和DLL配合使用的,里面没有代码,代码在DLL中,这种LIB是用在静态调用DLL上的,所以起的作用也是编译中用,编译完成了,LIB也没用了.至于动态调用DLL的话,根本用不上LIB文件.<br>
<img src ="http://www.cppblog.com/toMyself/aggbug/75736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2009-03-06 13:57 <a href="http://www.cppblog.com/toMyself/archive/2009/03/06/75736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>加锁</title><link>http://www.cppblog.com/toMyself/archive/2009/03/05/75633.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Thu, 05 Mar 2009 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2009/03/05/75633.html</guid><description><![CDATA[关键区域&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和其他同步对象不同，除非有需要以外，关键区域工作在用户模式下。若一个线程想运行一个封装在关键区域中的代<br>码，它首先做一个旋转封锁，然后等待特定的时间，它进入内核模式去等待关键区域。实际上，关键区域持有一个旋转计数器和一个信号量，前者用于用户模式的等待，后者用于内核模式的等待（休眠态）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Win32API中，有一个L_SECTION结构体表示关键区域对象。在MFC中，有一个类CCriticalSection。关键区域是这样一段代码，当它被一个线程执行时，必须确保不会被另一个线程中断。<br><br>Linux设备驱动之并发控制: 自旋锁与信号量（绝大多数时候作为互斥锁使用）。<br>原子操作<br>锁的作用域：在哪定义一把锁？
 <img src ="http://www.cppblog.com/toMyself/aggbug/75633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2009-03-05 15:31 <a href="http://www.cppblog.com/toMyself/archive/2009/03/05/75633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++点滴</title><link>http://www.cppblog.com/toMyself/archive/2009/03/05/75629.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Thu, 05 Mar 2009 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2009/03/05/75629.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/75629.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2009/03/05/75629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/75629.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/75629.html</trackback:ping><description><![CDATA[<p>类成员指针的讲解详见c++primer高级主题<br>typedef void (T::* HANDLER)(ObjectMessage* pMessage);<br><br>delete this;<br><br>string内存布局不透明，只能用new类，不能用malloc类。用memset会把类里的一些必要数据也清零。比如如果类有虚函数，则就有虚表指针，你用memset会把虚函数表指针置为0，这样你的类还有多态吗，你的程序还是健壮的吗?&nbsp; 有构造函数为什么还要如此呢!!!!!! <br><br>uint32数据总是大于0. <br><br>_DEBUG;</p>
<p>mutable<br>explicit<br>std::cout.write(buf.data(), len);<br><br>一个线程只能在一个CPU core上运行。<br><br>错误处理(Error-Handling)<br>异常规格申明<br>ip地址映射 NAT（网络地址转换）<br>刚刚断开的socket被新加入的连接socket重用，导致处理复杂逻辑的线程里把应该发给原来断开的SOCKET的数据发给新&nbsp;上来SOCKET了，呵呵，所以错误就出现了。<br>&nbsp;<br><br>原型：extern char *strlwr(char *s);<br>功能：将字符串s转换为小写形式<br>说明：只转换s中出现的大写字母，不改变其它字符。返回指向s的指针<br><br>原型：extern char *strupr(char *s);<br>功能：将字符串s转换为大写形式<br>说明：只转换s中出现的小写字母，不改变其它字符。返回指向s的指针。 </p>
<img src ="http://www.cppblog.com/toMyself/aggbug/75629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2009-03-05 15:25 <a href="http://www.cppblog.com/toMyself/archive/2009/03/05/75629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>char*与std::string</title><link>http://www.cppblog.com/toMyself/archive/2009/03/04/75487.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Wed, 04 Mar 2009 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2009/03/04/75487.html</guid><description><![CDATA[1，从数据流中取出指定长度的字节，不能保证该段字节是以'\0'结尾，故取的时候要主动在其后面加上'\0'，保证它一定是字符串（特别是使用char*接收的时候）。使用std::string(s)亦可将字符流转换成字符串？？？？？No!!! 转换的字节流也是以在找到'\0'时才结束。<br>&nbsp;2，向Data Stream中压入string类型的数据时，Data Stream使用strlen()来计算它的长度。<br>&nbsp;3，为了保险起见，发送指定长度的字节时，最好后面跟上一个'\0'。<br>&nbsp;4，一般化：当要将一段字节流当作字符串使用时，应该主动地、显示地在字节流的末尾加上'\0'。 
 <img src ="http://www.cppblog.com/toMyself/aggbug/75487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2009-03-04 10:52 <a href="http://www.cppblog.com/toMyself/archive/2009/03/04/75487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>