锘??xml version="1.0" encoding="utf-8" standalone="yes"?>在线欧美小视频,美国成人直播,久久狠狠亚洲综合 http://www.shnenglu.com/ace/category/1169.html<table style="border:1px solid #aa0033; font-size:small" align=center>
<tr>
<td rowspan=3>
</td>
<td colspan=2 align=center><b>璁㈤槄 ace-china</b></td>
</tr>
<form action="http://groups.google.com/group/ace-china/boxsubscribe">
<input type=hidden name="hl" value="zh-CN">
<tr>
<td>鐢靛瓙閭歡錛?<input type=text name=email></td>
<td>
<table
style="background-color:#ffcc33;padding:2px;border:2px outset #ffcc33;">
<tr>
<td>
<input type=submit name="sub" value="璁㈤槄">
</td>
</tr>
</table>
</td>
</tr>
</form>
<tr><td colspan=2 align=center> 嫻忚瀛樹簬
<a >groups.google.com</a> 涓婄殑<a >鎵鏈夊笘瀛?lt;/a> </td></tr>
</table> zh-cn Tue, 20 May 2008 01:09:29 GMT Tue, 20 May 2008 01:09:29 GMT 60 鍦╒isual Studio 2005涓嬩嬌鐢–PPUnit鍚戝 http://www.shnenglu.com/ace/archive/2006/08/04/10842.htmlStone Jiang Stone Jiang Fri, 04 Aug 2006 07:35:00 GMT http://www.shnenglu.com/ace/archive/2006/08/04/10842.html http://www.shnenglu.com/ace/comments/10842.html http://www.shnenglu.com/ace/archive/2006/08/04/10842.html#Feedback 1 http://www.shnenglu.com/ace/comments/commentRss/10842.html http://www.shnenglu.com/ace/services/trackbacks/10842.html 浣跨敤CPPUnitProjectWizard鍚戝鍒涘緩鏀寔浣跨敤CPPUnit鐨勬祴璇曠被鐨刅isual Studio 2005欏圭洰銆?/p>
瀹夎鍚戝 0. 涓嬭澆 CPPUnitProjectWizard 聽聽聽 http://cppunit.sourceforge.net/cppunit-wiki/CppUnitVisualStudio2005Wizard?action=AttachFile&do=get&target=CPPUnitProjectWizard.7z
1. 澶嶅埗鏂囦歡 聽聽聽聽 CPPUnitProjectWizard.vsdir聽 - 涓哄悜瀵煎懡鍚?br />聽聽聽聽 CPPUnitProjectWizard.vsz聽聽聽 - 璁¬S8鐭ラ亾浠庡摢閲屾壘鍒板悜瀵?br />聽聽聽 鍒版偍鐨刅isual Studio 8瀹夎鐩綍涓嬬殑 VSProjects 鏂囦歡澶逛腑銆?br />聽聽聽 2. 鎶婃暣涓狢PPUnitProjectWizard瑙e喅鏂規鏂囦歡澶瑰鍒跺埌鎮ㄧ殑Visual Studio 8瀹夎鐩綍涓嬬殑VCWizards鏂囦歡澶逛腑銆?br />聽聽 姣斿錛屾垜鏀懼湪c:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\CPPUnitProjectWizard\CPPUnitProjectWizard 聽聽 鎴栬咃紝涔熷彲浠ユ斁鍦ㄤ綘鎯蟲斁緗殑鍏跺畠鍦版柟錛岀劧鍚庣紪璇慍PPUnitProjectWizard.vsz錛屽畾涔夊弬鏁?ABSOLUTE_PATH 聽聽 Param="ABSOLUTE_PATH = c:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\CPPUnitProjectWizard\CPPUnitProjectWizard" 聽聽 3. 璇ラ」鐩渶瑕佸畾涔夌幆澧冨彉閲?CPPUNITDIR 聽聽 姣斿錛屾垜鐨勭幆澧冨彉閲徛?%CPPUNITDIR% = D:\cppunit-1.12.0 聽聽 鏈鍚庯紝淇敼 鐜鍙橀噺 %PATH%,鍦≒ATH璺緞涓紝澧炲姞 %CPPUNITDIR%/lib錛屼互渚跨▼搴忓姞杞芥椂鑳芥壘鍒?cppunit_dll.dll 4. 鍦ㄥ紑鍙戠幆澧冧腑錛岃緗ソInclude/Lib璺緞 聽聽聽 %CPPUNITDIR%\Include 聽聽聽 %CPPUNITDIR%\LIB 聽聽聽
]]> 闈㈠悜瀵硅薄vs鍩轟簬瀵硅薄 http://www.shnenglu.com/ace/archive/2006/06/25/8985.htmlStone Jiang Stone Jiang Sun, 25 Jun 2006 08:18:00 GMT http://www.shnenglu.com/ace/archive/2006/06/25/8985.html http://www.shnenglu.com/ace/comments/8985.html http://www.shnenglu.com/ace/archive/2006/06/25/8985.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/8985.html http://www.shnenglu.com/ace/services/trackbacks/8985.html 闈㈠悜瀵硅薄vs鍩轟簬瀵硅薄
鐪嬪埌浜嗕竴縐嶈娉曪紝寰堝鎵璋撻潰鍚戝璞″紑鍙戝彧涓嶈繃鏄熀浜庡璞$殑寮鍙?wbr>銆傚弽鎬濊嚜韜紝鍙戣涓閽堣琛銆?/wbr>
鎴戜滑鎵璋撶殑闈㈠悜瀵硅薄錛屽疄闄呬笂鍙笉榪囧皝瑁呬簡涓氬姟瀵硅薄錛屽垎鍑轟簡灞傛錛屾彁渚涗簡鎺ュ彛銆傝櫧鐒跺湪璁捐鍜屽疄鐜扮殑鏃跺欎嬌鐢ㄥ埌浜嗛潰鍚戝璞$殑灝佽錛屼絾鐜板湪鐪嬫潵榪樼畻涓嶄笂鐪熸鐨勯潰鍚戝璞★紝鍙兘綆楁槸鍩轟簬瀵硅薄鑰屽凡銆?/wbr>
闈㈠悜瀵硅薄鐨勫師鍒欏茍娌℃湁絎﹀悎銆傞潰鍚戝璞$殑浼樺娍涔熸病鏈夊彂鎸ワ紝鍙嶈屾劅瑙変竴涓皬鍙樺寲灝辯壍鎵埌澶氬眰鐨勫彉鍔紝楹葷儲銆傚氨濂芥瘮鍘誨勾鐨勯」鐩紝鏁版嵁搴撻噰鐢∣RACLE錛屽疄闄呮湰韜ORACLE騫朵笉鐔熸倝錛屽彧緇忚繃涓嶅埌涓鍛ㄧ殑瀛︿範錛屽氨涓婇┈浜嗐傜粨鏋滃彧涓嶈繃灝哋RACLE褰撴垚MSSQL浣跨敤銆侽RACLE鐨勫己澶т笉浣嗘病鏈変綋鐜幫紙鍒扮幇鍦ㄤ篃娌℃湁鎼炴槑鐧斤級錛屽弽鑰屽け鍘諱簡MSSQL鐨勫ソ鐨勭粡楠屻傚緱涓嶅伩澶便?
涓嶈繃錛屽浣曟墠綆楃湡姝g殑闈㈠悜瀵硅薄鍛紵鎯充簡鎯充竴涓ソ鐨勯潰鍚戝璞$殑瀹炶返錛屽簲璇ユ槸杈懼埌鏈澶ч檺搴︾殑杞歡澶嶇敤錛屽茍涓斿彲浠ュ揩閫熼傚簲涓嶆柇鍙樺寲鐨勯渶姹傦紝鑰屽宸叉湁鐨勯儴鍒嗗獎鍝嶆渶灝?wbr>銆?/wbr>
榪欎笉鏄竴韞磋屽氨鐨勪簨鎯咃紝濡傛灉鎯崇湡姝g殑鐢ㄩ」鐩潵瀹炶返鐨勮瘽錛屾紜殑姝ラ涔熻搴旇鏄細
棣栧厛閲囩敤鏈韓杈冪啛鎮夌殑寮鍙戞柟娉曪紙鍩轟簬瀵硅薄鎴栨槸闈㈠悜榪囩▼錛夋弧瓚充笟鍔¢渶姹?wbr>銆傝繖涓姝ュ緢鍏抽敭錛屽彧鏈夋湁浜嗚繖鏍蜂竴涓師鍨嬫墠鍙互楠岃瘉瀵歸渶姹傜殑婊¤凍紼嬪害銆備釜浜烘劅瑙夌洿鎺ラ潰鍚戝璞′細闄峰叆璁捐榪囧害錛屽茍涓斿湪鍓嶆湡鑰楄垂澶ч噺鐨?wbr>綺懼姏銆傛洿閲嶈鐨勬槸浣跨敤涓嶇啛鎮夌殑鎶鏈細甯︽潵椋庨櫓錛屽緱涓嶅伩澶便?/wbr>
鐒跺悗閫愭笎鐨勫皢閲囩敤鐪熸鐨勯潰鍚戝璞$殑鏂規硶灝嗙幇鏈夌殑鍘熷瀷榪涜閲嶆瀯銆傜洰鐨勬槸鎻愰珮鎬ц兘錛岀伒媧繪?wbr>錛屾墿灞曟э紝鍙鐢ㄦх瓑絳夛紝榪欐槸涓涓暱鏈熺殑涓嶆柇榪唬鐨勮繃紼嬨傚彲浠ュ弬鐪嬬粡鍏哥殑銆婇噸鏋?鏀瑰杽浠g爜璐ㄩ噺銆嬨?/wbr>
鏈鍚庝竴姝ユ槸鏋舵瀯鐨勬彁鐐箋傚皢緋葷粺涓殑鍙互澶栭儴澶嶇敤鐨勯儴鍒嗘彁鐐煎嚭鏉ュ艦鎴?wbr>涓涓彲浠ュ鐢ㄧ殑妗嗘灦鏋舵瀯銆傛湁浜嗗畠錛屼互鍚庣殑寮鍙戠浉浼氫簨鍗婂姛鍊?wbr>銆傛姝ラ灝嗕細鐢ㄥ埌閲嶆瀯鍜岃璁℃ā寮忋傛暣涓殑榪囩▼闄や簡絎竴姝ュ拰闈㈠悜瀵硅薄鏃犲ぇ鍏崇郴澶栵紝鍚庝袱姝ュ垯瀹屽叏鐨勯潰鍚?wbr>瀵硅薄鐨勬濇兂銆?/wbr>
鍦ㄦ涔嬪墠鎬繪槸甯屾湜鍏堟湁涓涓璁¤壇濂界殑鏋舵瀯錛屼竴鐩磋繖鏍蜂笉鏂殑瀛︿範鍜岃繘琛屽疄璺點傜粨鏋滃嵈涓嶅敖浜烘剰銆傜粡楠岃鏄庤繖鏍峰仛紜疄鏈変簺鏈湯鍊掔疆銆傛濡傛ā寮忕殑浣跨敤涓鏍?wbr>錛屽湪鍔ㄦ満涓嶆槑紜殑鎯呭喌涓嬬洸鐩殑濂楃敤妯″紡鏄病鏈夋剰涔夌殑銆?/wbr>
姣忎竴涓紑鍙戜漢鍛樼殑鑴戣涓湁涓浜涢潪甯哥編濡欑殑鍒涙剰錛岃繖浜涘垱鎰忔病鏈夊疄鐜扮殑涓涓師鍥犲氨鏄紝澶繃鍏蟲敞緇嗚妭銆傚浜庨潰鍚戝璞¤繕鏄熀浜庡璞″紑鍙戯紝瀵逛簬瀹炵幇闇姹傦紝瀹屾垚欏圭洰鐨勫垵鏈熼樁孌碉紝鐪熺殑鏃犳墍璋撱傚綋闇瑕佽冭檻鎻愰珮寮鍙戝拰緇存姢鏁堢巼鐨勬椂鍊欙紝闈㈠悜瀵硅薄灝辨垚浜嗗緢涓嶉敊鐨勯夋嫨銆?/div>
]]>
紼嬪簭鍛樼殑鍏崳鍏?-- 鏉ユ簮涓嶈 http://www.shnenglu.com/ace/archive/2006/06/08/8289.htmlStone Jiang Stone Jiang Thu, 08 Jun 2006 03:03:00 GMT http://www.shnenglu.com/ace/archive/2006/06/08/8289.html http://www.shnenglu.com/ace/comments/8289.html http://www.shnenglu.com/ace/archive/2006/06/08/8289.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/8289.html http://www.shnenglu.com/ace/services/trackbacks/8289.html 紼嬪簭鍛樼殑鍏崳鍏?/p>
浠ュ瀹炵紪鐮佷負鑽?浠ュ績嫻皵韜佷負鑰?/p>
浠ヨ緇嗘敞閲婁負鑽?浠ユ敞閲婃畫緙轟負鑰?/p>
浠ュ嫟浜庢祴璇曚負鑽?浠ユ噿浜庢祴璇曚負鑰?/p>
浠ョ畝鏄庢枃妗d負鑽?浠ュ啑浣欐枃妗d負鑰?/p>
浠ユ敞閲嶅洟闃熶負鑽?浠ュ鍌茶嚜澶т負鑰?/p>
浠ュ埢鑻﹂捇鐮斾負鑽?浠ユ暦琛嶄簡浜嬩負鑰?/p>
浠ュ杽浜庢葷粨涓鴻崳 浠ヤ笉鎬濊繘鍙栦負鑰?/p>
浠ヨ川鏁堝茍榪涗負鑽?浠ュ崟鍙栧叾涓涓鴻?/p>
]]> 鍏充簬鐢ㄤ緥鐨勯殢絎? http://www.shnenglu.com/ace/archive/2006/06/06/8214.htmlStone Jiang Stone Jiang Tue, 06 Jun 2006 07:56:00 GMT http://www.shnenglu.com/ace/archive/2006/06/06/8214.html http://www.shnenglu.com/ace/comments/8214.html http://www.shnenglu.com/ace/archive/2006/06/06/8214.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/8214.html http://www.shnenglu.com/ace/services/trackbacks/8214.html
http://www.shnenglu.com/ace/archive/2006/06/06/8214.html
榪戞潵鍥犲伐浣滈渶瑕侊紝鎴戠粏闃呰浜嗕竴浜涗笌UML鐩稿叧鐨勪功綾嶃?/p>
榪欓噷錛屼互嫻佹按甯愮殑鏂瑰紡錛屼綔涓璧風瑪褰曘?/p>
鍏充簬鐢ㄤ緥錛?/p>
1. 鐢ㄤ緥鍗蟲槸闇姹傦紝浣嗛渶姹傚茍涓嶆槸鐢ㄤ緥銆?br />聽聽 鐢ㄤ緥鏄弿榪拌璁虹殑緋葷粺(SuD)鍔熻兘鎬ч渶姹傜殑錛屾墍浠ュ彲浠ヨ鐢ㄤ緥灝辨槸闇姹傘備絾闇姹傞櫎浜嗗姛鑳芥ч渶姹傦紝榪樻湁闈炲姛鑳芥ч渶姹傘傛墍浠ワ紝涓嶈兘璇撮渶姹傚氨鏄敤渚嬨?/p>
2. 鐢ㄤ緥涓嶇瓑浜庡姛鑳?br />聽聽 鐢ㄤ緥鏄弿榪扮郴緇熷姛鑳界殑錛屼絾鐢ㄤ緥涓嶆槸鍔熻兘銆傚姛鑳芥槸緋葷粺瑕佽揪鍒版垨婊¤凍鐨勭洰鏍囷紝鐢ㄤ緥鏄敤渚嬬殑鎵ц鑰?Actor)涓庣郴緇熶氦浜掔殑鎿嶄綔搴忓垪銆備袱鑰呮槸鏈夊樊寮傜殑銆?/p>
3. 鐢ㄤ緥鏄枃鏈屼笉鏄浘褰?br />聽聽 鐢ㄤ緥鏄弿榪版墽琛岃呬笌緋葷粺浜や簰鐨勬搷浣滃簭鍒楋紝瑕佷綋鐜板畠鐨勬墽琛岃呭湪涓庣郴緇熶氦浜掍駭鐢熺殑鍙鏌ョ殑浠峰箋傚浘褰粎浠呮槸鐢ㄤ緥鐨勬榪幫紝鍙敾鍥炬槸涓嶅鐨勩傜敱浜庤繖涓鐐癸紝鐢ㄤ緥寤烘ā鏄挵鍐欐枃妗g殑榪囩▼錛岃屼笉鏄敾鍥劇殑榪囩▼銆?/p>
4. 鐢ㄤ緥妯″瀷涓嶄粎浠呮槸灝忎漢鍔犻殢鍦?br />聽聽 鐢ㄤ緥妯″瀷涓嶄粎鏄渶姹傛柟闈㈢殑宸ヤ歡(artifact)錛屽畠榪樺寘鎷ˉ鍏呰鏄?鎻忚堪闈炲姛鑳介渶姹傜殑)錛岃瘝姹囪〃錛屾効鏅拰涓氬姟瑙勫垯銆傝繖浜涘悎鍦ㄤ竴璧鋒墠鏄渶姹傚垎鏋愮殑浜х墿銆?/p>
5. 鐢ㄤ緥鎶鏈棤欏誨璞℃妧鏈紝鍦ㄩ氳繃鐢ㄤ緥鍙戠幇錛屾弿榪幫紝綆$悊闇姹傜殑鏃跺欙紝鐢ㄤ笉鍒板璞℃妧鏈備絾鏄紝鐢ㄤ緥鏄潰鍚戝璞$殑鍒嗘瀽鍜岃璁$殑鍏抽敭闇姹傘?/p>
6. 鐢ㄤ緥蹇呴』鏈変竴涓富鎵ц鑰?(Primary actor) 聽聽 涓繪墽琛岃呯‘瀹氫簡鐢ㄤ緥鐨勫悕縐般傜敤渚嬪懡浠ら氬父鏄互涓繪墽琛岃呰瑙掔殑涓誨姩璇佺殑榪愬緇撴瀯鐨勭煭璇傚洜涓哄彧鏈夎繖鏍風殑鐭鎵嶈兘鍏呭垎鐨勬弿榪板嚭緋葷粺鐨勪環鍊箋傜敤渚嬪緩妯$殑鏍稿績灝辨槸瑕佹弿榪板嚭緋葷粺鐨勪環鍊箋?/p>
7. 涓夌綾誨瀷鐨勬墽琛岃?br />聽聽 鍩烘湰鎵ц鑰?(Primary actor)聽 :榪欑鐢ㄤ緥閫氳繃涓庣郴緇熶氦浜掕兘杈懼埌鐩爣 聽聽 鏀寔鎵ц鑰?(Supporting actor ) : 涓鴻璁虹殑緋葷粺錛圫uD)鎻愪緵鏈嶅姟 聽聽 騫曞悗鎵ц鑰?(Offstage actor ) :闄や簡涓婅堪涓ょ錛屽張瀵逛笂榪頒袱縐嶆墽琛岃呬笌緋葷粺浜や簰榪囩▼鍜岀粨鏋滄劅鍏磋叮鐨勪漢鎴栫墿銆?/p>
]]> 浠嬬粛涓浜涘湪C++鐢ㄦ埛緇勪腑甯稿嚭鐜扮殑緙╃暐璇?/title> http://www.shnenglu.com/ace/archive/2006/06/04/8144.htmlStone Jiang Stone Jiang Sun, 04 Jun 2006 04:18:00 GMT http://www.shnenglu.com/ace/archive/2006/06/04/8144.html http://www.shnenglu.com/ace/comments/8144.html http://www.shnenglu.com/ace/archive/2006/06/04/8144.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/8144.html http://www.shnenglu.com/ace/services/trackbacks/8144.html Here's a partial list of acronyms in alphabetical order:
AFAICS = As far as I can see
BTW = By the way
FWIW = For what it's worth
FYI = For your information
HAND = Have a nice day
IMHO = In my humble opinion (egoless)
IMAO = In my arrogant opinion (oodles of ego)
IMNSHO = In my not-so humble opinion (a lot of ego)
IMO = In my opinion (not much ego)
KUTGW = Keep up the good work
MYOB = Mind your own business
OO = Object-oriented
OTOH = On the other hand
PEBCAC = Problem exists between chair and computer
PEBCAK = Problem exists between chair and keyboard
PMFJI = Pardon me for jumping in
RTFM = Read the ___ manual
SO = Significant other (as in, "My SO and I went for a walk...")
SSO = Small String Optimization (where short strings don't use the heap)
YHBT = You have been trolled
YHL = You have lost
]]> 鍏充簬鐢ㄤ緥妯″紡鐨勪竴鍙ヨ瘽璇勮 http://www.shnenglu.com/ace/archive/2006/06/02/8070.htmlStone Jiang Stone Jiang Fri, 02 Jun 2006 01:33:00 GMT http://www.shnenglu.com/ace/archive/2006/06/02/8070.html http://www.shnenglu.com/ace/comments/8070.html http://www.shnenglu.com/ace/archive/2006/06/02/8070.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/8070.html http://www.shnenglu.com/ace/services/trackbacks/8070.html 涔︾睄鎺ㄨ崘 "Use Cases Patterns and Blueprints " ]]>static_cast<>鎻瘑 (杞? http://www.shnenglu.com/ace/archive/2006/05/22/7510.htmlStone Jiang Stone Jiang Mon, 22 May 2006 13:18:00 GMT http://www.shnenglu.com/ace/archive/2006/05/22/7510.html http://www.shnenglu.com/ace/comments/7510.html http://www.shnenglu.com/ace/archive/2006/05/22/7510.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/7510.html http://www.shnenglu.com/ace/services/trackbacks/7510.html
static_cast<>鎻瘑
浣滆咃細Sam NG
璇戣咃細灝忓垁浜?/a>
鍘熸枃閾炬帴錛?a >What static_cast<> is actually doing 鏈枃璁ㄨstatic_cast<> 鍜?reinterpret_cast<>銆?
浠嬬粛
澶у紼嬪簭鍛樺湪瀛++鍓嶉兘瀛﹁繃C錛屽茍涓斾範鎯簬C椋庢牸錛堢被鍨嬶級杞崲銆傚綋鍐機++錛堢▼搴忥級鏃訛紝鏈夋椂鍊欐垜浠湪浣跨敤static_cast<>鍜宺einterpret_cast<>鏃跺彲鑳戒細鏈夌偣妯$硦銆傚湪鏈枃涓紝鎴戝皢璇存槑static_cast<>瀹為檯涓婂仛浜嗕粈涔堬紝騫朵笖鎸囧嚭涓浜涘皢浼氬鑷撮敊璇殑鎯呭喌銆?br />娉涘瀷錛圙eneric Types錛?/strong>
float f = 12.3;
float* pf = &f;
// static cast<>
// 鎴愬姛緙栬瘧, n = 12
int n = static_cast<int>(f);
// 閿欒,鎸囧悜鐨勭被鍨嬫槸鏃犲叧鐨勶紙璇戞敞錛氬嵆鎸囬拡鍙橀噺pf鏄痜loat綾誨瀷錛岀幇鍦ㄨ琚漿鎹負int綾誨瀷錛?
//int* pn = static_cast<int*>(pf);
//鎴愬姛緙栬瘧
void* pv = static_cast<void*>(pf);
//鎴愬姛緙栬瘧, 浣嗘槸 *pn2鏄棤鎰忎箟鐨勫唴瀛橈紙rubbish錛?br />
int* pn2 = static_cast<int*>(pv);
// reinterpret_cast<>
//閿欒,緙栬瘧鍣ㄧ煡閬撲綘搴旇璋冪敤static_cast<>
//int i = reinterpret_cast<int>(f);
//鎴愬姛緙栬瘧, 浣嗘槸 *pn 瀹為檯涓婃槸鏃犳剰涔夌殑鍐呭瓨,鍜?*pn2涓鏍?br />
int* pi = reinterpret_cast<int*>(pf);
綆鑰岃█涔嬶紝static_cast<> 灝嗗皾璇曡漿鎹紝涓句緥鏉ヨ錛屽float-鍒?integer錛岃宺einterpret_cast<>綆鍗曟敼鍙樼紪璇戝櫒鐨勬剰鍥鵑噸鏂拌冭檻閭d釜瀵硅薄浣滀負鍙︿竴綾誨瀷銆?br />鎸囬拡綾誨瀷錛圥ointer Types錛?/strong> 鎸囬拡杞崲鏈夌偣澶嶆潅錛屾垜浠皢鍦ㄦ湰鏂囩殑鍓╀綑閮ㄥ垎浣跨敤涓嬮潰鐨勭被錛?br />class CBaseX
{
public:
int x;
CBaseX() { x = 10; }
void foo() { printf("CBaseX::foo() x=%d\n", x); }
};
class CBaseY
{
public:
int y;
int* py;
CBaseY() { y = 20; py = &y; }
void bar() { printf("CBaseY::bar() y=%d, *py=%d\n", y, *py);
}
};
class CDerived : public CBaseX, public CBaseY
{
public:
int z;
};
鎯呭喌1錛氫袱涓棤鍏崇殑綾諱箣闂寸殑杞崲
// Convert between CBaseX* and CBaseY*
// CBaseX* 鍜?CBaseY*涔嬮棿鐨勮漿鎹?br />
CBaseX* pX = new CBaseX();
// Error, types pointed to are unrelated
// 閿欒錛?綾誨瀷鎸囧悜鏄棤鍏崇殑
// CBaseY* pY1 = static_cast<CBaseY*>(pX);
// Compile OK, but pY2 is not CBaseX
// 鎴愬姛緙栬瘧, 浣嗘槸 pY2 涓嶆槸CBaseX
CBaseY* pY2 = reinterpret_cast<CBaseY*>(pX);
// System crash!!
// 緋葷粺宕╂簝!!
// pY2->bar(); 姝e鎴戜滑鍦ㄦ硾鍨嬩緥瀛愪腑鎵璁よ瘑鍒扮殑錛屽鏋滀綘灝濊瘯杞崲涓涓璞″埌鍙︿竴涓棤鍏崇殑綾籹tatic_cast<>灝嗗け璐ワ紝鑰宺einterpret_cast<>灝辨繪槸鎴愬姛鈥滄楠椻濈紪璇戝櫒錛氶偅涓璞″氨鏄偅涓棤鍏崇被銆?br />鎯呭喌2錛氳漿鎹㈠埌鐩稿叧鐨勭被 1. CDerived* pD = new CDerived();
2. printf("CDerived* pD = %x\n", (int)pD);
3.
4. // static_cast<> CDerived* -> CBaseY* -> CDerived*
//鎴愬姛緙栬瘧錛岄殣寮弒tatic_cast<>杞崲
5. CBaseY* pY1 = pD;
6. printf("CBaseY* pY1 = %x\n", (int)pY1);
// 鎴愬姛緙栬瘧, 鐜板湪 pD1 = pD
7. CDerived* pD1 = static_cast<CDerived*>(pY1);
8. printf("CDerived* pD1 = %x\n", (int)pD1);
9.
10. // reinterpret_cast
// 鎴愬姛緙栬瘧, 浣嗘槸 pY2 涓嶆槸 CBaseY*
11. CBaseY* pY2 = reinterpret_cast<CBaseY*>(pD);
12. printf("CBaseY* pY2 = %x\n", (int)pY2);
13.
14. // 鏃犲叧鐨?static_cast<>
15. CBaseY* pY3 = new CBaseY();
16. printf("CBaseY* pY3 = %x\n", (int)pY3);
// 鎴愬姛緙栬瘧,灝界 pY3 鍙槸涓涓?"鏂?CBaseY()"
17. CDerived* pD3 = static_cast<CDerived*>(pY3);
18. printf("CDerived* pD3 = %x\n", (int)pD3); ---------------------- 杈撳嚭 ---------------------------
CDerived* pD = 392fb8
CBaseY* pY1 = 392fbc
CDerived* pD1 = 392fb8
CBaseY* pY2 = 392fb8
CBaseY* pY3 = 390ff0
CDerived* pD3 = 390fec 娉ㄦ剰錛氬湪灝咰Derived*鐢ㄩ殣寮?static_cast<>杞崲鍒癈BaseY*錛堢5琛岋級鏃訛紝緇撴灉鏄紙鎸囧悜錛塁Derived*錛堢殑鎸囬拡鍚戝悗錛?鍋忕Щ浜?錛堜釜瀛楄妭錛夛紙璇戞敞錛?涓篿nt綾誨瀷鍦ㄥ唴瀛樹腑鎵鍗犲瓧鑺傛暟錛夈備負浜嗙煡閬搒tatic_cast<> 瀹為檯濡備綍錛屾垜浠笉寰椾笉瑕佹潵鐪嬩竴涓婥Derived鐨勫唴瀛樺竷灞銆?/p>
CDerived鐨勫唴瀛樺竷灞錛圡emory Layout錛?/strong> 濡傚浘鎵紺猴紝CDerived鐨勫唴瀛樺竷灞鍖呮嫭涓や釜瀵硅薄錛孋BaseX 鍜?CBaseY錛岀紪璇戝櫒涔熺煡閬撹繖涓鐐廣傚洜姝わ紝褰撲綘灝咰Derived* 杞崲鍒?CBaseY*鏃訛紝瀹冪粰鎸囬拡娣誨姞4涓瓧鑺傦紝鍚屾椂褰撲綘灝咰BaseY*杞崲鍒癈Derived*鏃訛紝瀹冪粰鎸囬拡鍑忓幓4銆傜劧鑰岋紝鐢氳嚦瀹冨嵆渚夸笉鏄竴涓狢Derived浣犱篃鍙互榪欐牱鍋氥?br />褰撶劧錛岃繖涓棶棰樺彧鍦ㄥ鏋滀綘鍋氫簡澶氱戶鎵挎椂鍙戠敓銆傚湪浣犲皢CDerived杞崲 鍒?CBaseX鏃秙tatic_cast<> 鍜?reinterpret_cast<>鏄病鏈夊尯鍒殑銆?br />鎯呭喌3錛歷oid*涔嬮棿鐨勫悜鍓嶅拰鍚戝悗杞崲 鍥犱負浠諱綍鎸囬拡鍙互琚漿鎹㈠埌void*錛岃寁oid*鍙互琚悜鍚庤漿鎹㈠埌浠諱綍鎸囬拡錛堝浜巗tatic_cast<> 鍜?reinterpret_cast<>杞崲閮藉彲浠ヨ繖鏍峰仛錛夛紝濡傛灉娌℃湁灝忓績澶勭悊鐨勮瘽閿欒鍙兘鍙戠敓銆?br />
CDerived* pD = new CDerived();
printf("CDerived* pD = %x\n", (int)pD);
CBaseY* pY = pD; // 鎴愬姛緙栬瘧, pY = pD + 4
printf("CBaseY* pY = %x\n", (int)pY);
void* pV1 = pY; //鎴愬姛緙栬瘧, pV1 = pY
printf("void* pV1 = %x\n", (int)pV1);
// pD2 = pY, 浣嗘槸鎴戜滑棰勬湡 pD2 = pY - 4
CDerived* pD2 = static_cast<CDerived*>(pV1);
printf("CDerived* pD2 = %x\n", (int)pD2);
// 緋葷粺宕╂簝
// pD2->bar();
---------------------- 杈撳嚭 ---------------------------
CDerived* pD = 392fb8
CBaseY* pY = 392fbc
void* pV1 = 392fbc
CDerived* pD2 = 392fbc 涓鏃︽垜浠凡緇忚漿鎹㈡寚閽堜負void*錛屾垜浠氨涓嶈兘杞繪槗灝嗗叾杞崲鍥炲師綾匯傚湪涓婇潰鐨勪緥瀛愪腑錛屼粠涓涓獀oid* 榪斿洖CDerived*鐨勫敮涓鏂規硶鏄皢鍏惰漿鎹負CBaseY*鐒跺悗鍐嶈漿鎹負CDerived*銆? 浣嗘槸濡傛灉鎴戜滑涓嶈兘紜畾瀹冩槸CBaseY* 榪樻槸 CDerived*錛岃繖鏃舵垜浠笉寰椾笉鐢╠ynamic_cast<> 鎴杢ypeid[2]銆?br />娉ㄩ噴錛?/strong> 1. dynamic_cast<>錛屼粠鍙︿竴鏂歸潰鏉ヨ錛屽彲浠ラ槻姝竴涓硾鍨婥BaseY* 琚漿鎹㈠埌CDerived*銆?br />2. dynamic_cast<>闇瑕佺被鎴愪負澶氭侊紝鍗沖寘鎷滆櫄鈥濆嚱鏁幫紝騫跺洜姝よ屼笉鑳芥垚涓簐oid*銆?br />鍙傝冿細 1. [MSDN] C++ Language Reference -- Casting 2. Nishant Sivakumar, Casting Basics - Use C++ casts in your VC++.NET programs 3. Juan Soulie, C++ Language Tutorial: Type Casting
]]> C/C++ 鍐呭瓨綆$悊 Heap vs Stack http://www.shnenglu.com/ace/archive/2006/05/17/7313.htmlStone Jiang Stone Jiang Wed, 17 May 2006 09:09:00 GMT http://www.shnenglu.com/ace/archive/2006/05/17/7313.html http://www.shnenglu.com/ace/comments/7313.html http://www.shnenglu.com/ace/archive/2006/05/17/7313.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/7313.html http://www.shnenglu.com/ace/services/trackbacks/7313.html
杞敞:聽聽聽 浠婂ぉ鏈夌綉鍙嬮棶鍒拌繖涓棶棰?浜庢槸鍦ㄧ綉涓婃悳绱簡涓涓?杞創榪欐. 鐩鎬技鐨勫お澶氫簡,鍑哄涓嶈.鍦ㄦ鎰熻阿鍘熶綔鑰呯簿褰╄瑙?
涓銆侀澶囩煡璇嗏旂▼搴忕殑鍐呭瓨鍒嗛厤 涓涓敱c/C++緙栬瘧鐨勭▼搴忓崰鐢ㄧ殑鍐呭瓨鍒嗕負浠ヤ笅鍑犱釜閮ㄥ垎 1銆佹爤鍖猴紙stack錛夆斅犵敱緙栬瘧鍣ㄨ嚜鍔ㄥ垎閰嶉噴鏀韭狅紝瀛樻斁鍑芥暟鐨勫弬鏁板鹼紝灞閮ㄥ彉閲忕殑鍊肩瓑銆傚叾鎿嶄綔鏂瑰紡綾諱技浜庢暟鎹粨鏋勪腑鐨勬爤銆? 2銆佸爢鍖猴紙heap錛壜犫斅犱竴鑸敱紼嬪簭鍛樺垎閰嶉噴鏀撅紝聽鑻ョ▼搴忓憳涓嶉噴鏀撅紝紼嬪簭緇撴潫鏃跺彲鑳界敱OS鍥炴敹聽銆傛敞鎰忓畠涓庢暟鎹粨鏋勪腑鐨勫爢鏄袱鍥炰簨錛屽垎閰嶆柟寮忓掓槸綾諱技浜庨摼琛紝鍛靛懙銆? 3銆佸叏灞鍖猴紙闈欐佸尯錛夛紙static錛夆旓紝鍏ㄥ眬鍙橀噺鍜岄潤鎬佸彉閲忕殑瀛樺偍鏄斁鍦ㄤ竴鍧楃殑錛屽垵濮嬪寲鐨勫叏灞鍙橀噺鍜岄潤鎬佸彉閲忓湪涓鍧楀尯鍩燂紝聽鏈垵濮嬪寲鐨勫叏灞鍙橀噺鍜屾湭鍒濆鍖栫殑闈欐佸彉閲忓湪鐩擱偦鐨勫彟涓鍧楀尯鍩熴偮?聽紼嬪簭緇撴潫鍚庢湁緋葷粺閲婃斁 4銆佹枃瀛楀父閲忓尯聽鈥斿父閲忓瓧絎︿覆灝辨槸鏀懼湪榪欓噷鐨勩偮犵▼搴忕粨鏉熷悗鐢辯郴緇熼噴鏀? 5銆佺▼搴忎唬鐮佸尯鈥斿瓨鏀懼嚱鏁頒綋鐨勪簩榪涘埗浠g爜銆? 浜屻佷緥瀛愮▼搴? 榪欐槸涓涓墠杈堝啓鐨勶紝闈炲父璇︾粏 // main.cpp聽 int 聽a聽 = 聽 0 ;聽鍏ㄥ眬鍒濆鍖栧尯聽 char 聽 * p1;聽鍏ㄥ眬鏈垵濮嬪寲鍖郝?br /> main()聽 {聽 int 聽b; // 聽鏍埪?/span>char 聽s[]聽 = 聽 " abc " ;聽 // 鏍埪?/span>char 聽 * p2;聽 // 鏍埪?/span>char 聽 * p3聽 = 聽 " 123456 " ;聽 123456 \ 0 " ;//鍦ㄥ父閲忓尯錛宲3鍦ㄦ爤涓娿偮?/span>static 聽 int 聽c聽 = 0 錛浡?/span>// 鍏ㄥ眬錛堥潤鎬侊級鍒濆鍖栧尯聽 p1聽 = 聽( char 聽 * )malloc( 10 );聽 p2聽 = 聽( char 聽 * )malloc( 20 );聽 // 鍒嗛厤寰楁潵寰?0鍜?0瀛楄妭鐨勫尯鍩熷氨鍦ㄥ爢鍖恒偮?/span>strcpy(p1,聽 " 123456 " );聽 // 123456\0鏀懼湪甯擱噺鍖猴紝緙栬瘧鍣ㄥ彲鑳戒細灝嗗畠涓巔3鎵鎸囧悜鐨?123456"浼樺寲鎴愪竴涓湴鏂廣偮?/span>} 聽聽 涓夈佸爢鍜屾爤鐨勭悊璁虹煡璇? 3.1鐢寵鏂瑰紡 stack: 鐢辯郴緇熻嚜鍔ㄥ垎閰嶃偮犱緥濡傦紝澹版槑鍦ㄥ嚱鏁頒腑涓涓眬閮ㄥ彉閲徛爄nt聽b;聽緋葷粺鑷姩鍦ㄦ爤涓負b寮杈熺┖闂? heap: 闇瑕佺▼搴忓憳鑷繁鐢寵錛屽茍鎸囨槑澶у皬錛屽湪c涓璵alloc鍑芥暟 濡俻1聽=聽(char聽*)malloc(10); 鍦–++涓敤new榪愮畻絎? 濡俻2聽=聽(char聽*)malloc(10); 浣嗘槸娉ㄦ剰p1銆乸2鏈韓鏄湪鏍堜腑鐨勩? 3.2 鐢寵鍚庣郴緇熺殑鍝嶅簲 鏍堬細鍙鏍堢殑鍓╀綑絀洪棿澶т簬鎵鐢寵絀洪棿錛岀郴緇熷皢涓虹▼搴忔彁渚涘唴瀛橈紝鍚﹀垯灝嗘姤寮傚父鎻愮ず鏍堟孩鍑恒? 鍫嗭細棣栧厛搴旇鐭ラ亾鎿嶄綔緋葷粺鏈変竴涓褰曠┖闂插唴瀛樺湴鍧鐨勯摼琛紝褰撶郴緇熸敹鍒扮▼搴忕殑鐢寵鏃訛紝 浼氶亶鍘嗚閾捐〃錛屽鎵劇涓涓┖闂村ぇ浜庢墍鐢寵絀洪棿鐨勫爢緇撶偣錛岀劧鍚庡皢璇ョ粨鐐逛粠絀洪棽緇撶偣閾捐〃涓垹闄わ紝騫跺皢璇ョ粨鐐圭殑絀洪棿鍒嗛厤緇欑▼搴忥紝鍙﹀錛屽浜庡ぇ澶氭暟緋葷粺錛屼細鍦ㄨ繖鍧楀唴瀛樼┖闂翠腑鐨勯鍦板潃澶勮褰曟湰嬈″垎閰嶇殑澶у皬錛岃繖鏍鳳紝浠g爜涓殑delete璇彞鎵嶈兘姝g‘鐨勯噴鏀炬湰鍐呭瓨絀洪棿銆傚彟澶栵紝鐢變簬鎵懼埌鐨勫爢緇撶偣鐨勫ぇ灝忎笉涓瀹氭濂界瓑浜庣敵璇風殑澶у皬錛岀郴緇熶細鑷姩鐨勫皢澶氫綑鐨勯偅閮ㄥ垎閲嶆柊鏀懼叆絀洪棽閾捐〃涓? 3.3鐢寵澶у皬鐨勯檺鍒? 鏍堬細鍦╓indows涓?鏍堟槸鍚戜綆鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄竴鍧楄繛緇殑鍐呭瓨鐨勫尯鍩熴傝繖鍙ヨ瘽鐨勬剰鎬濇槸鏍堥《鐨勫湴鍧鍜屾爤鐨勬渶澶у閲忔槸緋葷粺棰勫厛瑙勫畾濂界殑錛屽湪聽WINDOWS涓嬶紝鏍堢殑澶у皬鏄?M錛堜篃鏈夌殑璇存槸1M錛屾諱箣鏄竴涓紪璇戞椂灝辯‘瀹氱殑甯告暟錛夛紝濡傛灉鐢寵鐨勭┖闂磋秴榪囨爤鐨勫墿浣欑┖闂存椂錛屽皢鎻愮ずoverflow銆傚洜姝わ紝鑳戒粠鏍堣幏寰楃殑絀洪棿杈冨皬銆? 鍫嗭細鍫嗘槸鍚戦珮鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄笉榪炵畫鐨勫唴瀛樺尯鍩熴傝繖鏄敱浜庣郴緇熸槸鐢ㄩ摼琛ㄦ潵瀛樺偍鐨勭┖闂插唴瀛樺湴鍧鐨勶紝鑷劧鏄笉榪炵畫鐨勶紝鑰岄摼琛ㄧ殑閬嶅巻鏂瑰悜鏄敱浣庡湴鍧鍚戦珮鍦板潃銆傚爢鐨勫ぇ灝忓彈闄愪簬璁$畻鏈虹郴緇熶腑鏈夋晥鐨勮櫄鎷熷唴瀛樸傜敱姝ゅ彲瑙侊紝鍫嗚幏寰楃殑絀洪棿姣旇緝鐏墊椿錛屼篃姣旇緝澶с? 3.4鐢寵鏁堢巼鐨勬瘮杈冿細 鏍堢敱緋葷粺鑷姩鍒嗛厤錛岄熷害杈冨揩銆備絾紼嬪簭鍛樻槸鏃犳硶鎺у埗鐨勩? 鍫嗘槸鐢眓ew鍒嗛厤鐨勫唴瀛橈紝涓鑸熷害姣旇緝鎱紝鑰屼笖瀹規槗浜х敓鍐呭瓨紕庣墖,涓嶈繃鐢ㄨ搗鏉ユ渶鏂逛究. 鍙﹀錛屽湪WINDOWS涓嬶紝鏈濂界殑鏂瑰紡鏄敤VirtualAlloc鍒嗛厤鍐呭瓨錛屼粬涓嶆槸鍦ㄥ爢錛屼篃涓嶆槸鍦ㄦ爤鏄洿鎺ュ湪榪涚▼鐨勫湴鍧絀洪棿涓繚鐣欎竴蹇唴瀛橈紝铏界劧鐢ㄨ搗鏉ユ渶涓嶆柟渚褲備絾鏄熷害蹇紝涔熸渶鐏墊椿 3.5鍫嗗拰鏍堜腑鐨勫瓨鍌ㄥ唴瀹? 鏍堬細聽鍦ㄥ嚱鏁拌皟鐢ㄦ椂錛岀涓涓繘鏍堢殑鏄富鍑芥暟涓悗鐨勪笅涓鏉℃寚浠わ紙鍑芥暟璋冪敤璇彞鐨勪笅涓鏉″彲鎵ц璇彞錛夌殑鍦板潃錛岀劧鍚庢槸鍑芥暟鐨勫悇涓弬鏁幫紝鍦ㄥぇ澶氭暟鐨凜緙栬瘧鍣ㄤ腑錛屽弬鏁版槸鐢卞彸寰宸﹀叆鏍堢殑錛岀劧鍚庢槸鍑芥暟涓殑灞閮ㄥ彉閲忋傛敞鎰忛潤鎬佸彉閲忔槸涓嶅叆鏍堢殑銆? 褰撴湰嬈″嚱鏁拌皟鐢ㄧ粨鏉熷悗錛屽眬閮ㄥ彉閲忓厛鍑烘爤錛岀劧鍚庢槸鍙傛暟錛屾渶鍚庢爤欏舵寚閽堟寚鍚戞渶寮濮嬪瓨鐨勫湴鍧錛屼篃灝辨槸涓誨嚱鏁頒腑鐨勪笅涓鏉℃寚浠わ紝紼嬪簭鐢辮鐐圭戶緇繍琛屻? 鍫嗭細涓鑸槸鍦ㄥ爢鐨勫ご閮ㄧ敤涓涓瓧鑺傚瓨鏀懼爢鐨勫ぇ灝忋傚爢涓殑鍏蜂綋鍐呭鏈夌▼搴忓憳瀹夋帓銆? 3.6瀛樺彇鏁堢巼鐨勬瘮杈? char聽s1[]聽=聽"aaaaaaaaaaaaaaa"; char聽*s2聽=聽"bbbbbbbbbbbbbbbbb"; aaaaaaaaaaa鏄湪榪愯鏃跺埢璧嬪肩殑錛? 鑰宐bbbbbbbbbb鏄湪緙栬瘧鏃跺氨紜畾鐨勶紱 浣嗘槸錛屽湪浠ュ悗鐨勫瓨鍙栦腑錛屽湪鏍堜笂鐨勬暟緇勬瘮鎸囬拡鎵鎸囧悜鐨勫瓧絎︿覆(渚嬪鍫?蹇? 姣斿錛?#include聽 < stdio.h > ;聽 void 聽main()聽 {聽 char 聽a聽 = 聽 1 ;聽 char 聽c[]聽 = 聽 " 1234567890 " ;聽 char 聽 * p聽 = " 1234567890 " ;聽 a聽 = 聽c[ 1 ];聽 a聽 = 聽p[ 1 ];聽 return ;聽 }聽
瀵瑰簲鐨勬眹緙栦唬鐮?10:聽a聽=聽c[1];聽 00401067聽8A聽4D聽F1聽mov聽cl,byte聽ptr聽[ebp-0Fh]聽 0040106A聽88聽4D聽FC聽mov聽byte聽ptr聽[ebp-4],cl聽 11:聽a聽=聽p[1];聽 0040106D聽8B聽55聽EC聽mov聽edx,dword聽ptr聽[ebp-14h]聽 00401070聽8A聽42聽01聽mov聽al,byte聽ptr聽[edx+1]聽 00401073聽88聽45聽FC聽mov聽byte聽ptr聽[ebp-4],al聽 絎竴縐嶅湪璇誨彇鏃剁洿鎺ュ氨鎶婂瓧絎︿覆涓殑鍏冪礌璇誨埌瀵勫瓨鍣╟l涓紝鑰岀浜岀鍒欒鍏堟妸鎸囬拡鍊艱鍒癳dx涓紝鍦ㄦ牴鎹甧dx璇誨彇瀛楃錛屾樉鐒舵參浜嗐? 3.7灝忕粨錛? 鍫嗗拰鏍堢殑鍖哄埆鍙互鐢ㄥ涓嬬殑姣斿柣鏉ョ湅鍑猴細 浣跨敤鏍堝氨璞℃垜浠幓楗閲屽悆楗紝鍙鐐硅彍錛堝彂鍑虹敵璇鳳級銆佷粯閽便佸拰鍚冿紙浣跨敤錛夛紝鍚冮ケ浜嗗氨璧幫紝涓嶅繀鐞嗕細鍒囪彍銆佹礂鑿滅瓑鍑嗗宸ヤ綔鍜屾礂紕椼佸埛閿呯瓑鎵熬宸ヤ綔錛屼粬鐨勫ソ澶勬槸蹇嵎錛屼絾鏄嚜鐢卞害灝忋? 浣跨敤鍫嗗氨璞℃槸鑷繁鍔ㄦ墜鍋氬枩嬈㈠悆鐨勮彍鑲達紝姣旇緝楹葷儲錛屼絾鏄瘮杈冪鍚堣嚜宸辯殑鍙e懗錛岃屼笖鑷敱搴﹀ぇ銆? 鍫嗗拰鏍堢殑鍖哄埆涓昏鍒嗭細 鎿嶄綔緋葷粺鏂歸潰鐨勫爢鍜屾爤錛屽涓婇潰璇寸殑閭d簺錛屼笉澶氳浜嗐? 榪樻湁灝辨槸鏁版嵁緇撴瀯鏂歸潰鐨勫爢鍜屾爤錛岃繖浜涢兘鏄笉鍚岀殑姒傚康銆傝繖閲岀殑鍫嗗疄闄呬笂鎸囩殑灝辨槸錛堟弧瓚沖爢鎬ц川鐨勶級浼樺厛闃熷垪鐨勪竴縐嶆暟鎹粨鏋勶紝絎?涓厓绱犳湁鏈楂樼殑浼樺厛鏉冿紱鏍堝疄闄呬笂灝辨槸婊¤凍鍏堣繘鍚庡嚭鐨勬ц川鐨勬暟瀛︽垨鏁版嵁緇撴瀯銆? 铏界劧鍫嗘爤錛屽爢鏍堢殑璇存硶鏄繛璧鋒潵鍙紝浣嗘槸浠栦滑榪樻槸鏈夊緢澶у尯鍒殑錛岃繛鐫鍙彧鏄敱浜庡巻鍙茬殑鍘熷洜銆?br /> ]]> 閬垮厤渚濊禆鐨勬秷鎭鐞嗘柟寮?(璇曡瘧) http://www.shnenglu.com/ace/archive/2006/05/04/6629.htmlStone Jiang Stone Jiang Thu, 04 May 2006 12:52:00 GMT http://www.shnenglu.com/ace/archive/2006/05/04/6629.html http://www.shnenglu.com/ace/comments/6629.html http://www.shnenglu.com/ace/archive/2006/05/04/6629.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/6629.html http://www.shnenglu.com/ace/services/trackbacks/6629.html 閬垮厤渚濊禆鐨勬秷鎭鐞嗘柟寮?br /> Anthony Williams url: http://www.ddj.com/dept/cpp/184429055 璇戣? Stone Jiang 璇戣呰鏄庯細鏈漢榪樺湪瀛︿範鑻辨枃鐨勮繃紼嬩腑錛屾湁浜涘彞瀛愬緢闅捐瘧錛岃繖閲岀粰鍑哄師鏂囩殑閾炬帴錛屾榪庡氨鍏朵腑璇戝緱涓嶅噯紜殑鍦版柟涓庢垜浜ゆ崲鎰忚銆?br />
鍦ㄦ偍緇存姢瀹夊叏綾誨瀷鍜岄伩鍏嶉泦鎴愮數璺埇鍑芥暟鏃?浣犲彲浠ヤ嬌鐢–++鐨勫己澶х殑鍔涢噺榪涜娑堟伅浼犻掋?/p>
Anthony鏄疛ust Software Solution鏈夐檺鍏徃鐨勪竴浣嶈蔣浠跺紑鍙戣呭拰鎵ц綆$悊鑰呫傚彲浠ラ氳繃anthony@justsoftwaresolutions.co.uk 涓庝箣鑱旂郴銆?/p>
浣跨敤閫氱敤鐨勬秷鎭紶閫掓柟寮忎紶閫掓暟鎹湪C++紼嬪簭涓緢鏅亶銆傝繖縐嶆妧鏈粡甯哥敤浜庡湪綰跨▼闂翠互鍙婁粠/鍒癎UI緇勪歡闂翠紶閫掓暟鎹備絾鏄秷鎭紶閫掍粛鐒跺緢闅懼疄鐜板緱鑹ソ錛岃繖鏄洜涓哄湪甯歌鐨勬秷鎭紶閫掓柟寮忎腑錛屾毚闇插嚭浜嗚繃澶氱殑钘曞悎銆佺己灝戠被鍨嬪畨鍏ㄥ拰闆嗘垚鐢佃礬鑸殑娑堟伅澶勭悊鍑芥暟銆?/p>
鍦ㄦ湰鏂囦腑錛屾垜鎻愬嚭浜嗕竴縐嶆妧鏈紝榪欑鎶鏈埄鐢–++鐨勫己澶у姏閲忔潵閬垮厤涓婅堪緙洪櫡鈥斺斿湪娑堟伅浼犻掍腑閬垮厤涓嶉傚綋鐨勮棔鍚堬紝緇存姢綾誨瀷瀹夊叏錛屼互鍙婃秷闄ら泦鎴愮數璺埇鐨勬秷鎭鐞嗗嚱銆? The only translation units that need to known the details of a message are those containning the source and handler functions for that specific message type.) 闇瑕佽漿鎹㈢殑鍗曞厓錛屽嵆闇瑕佺煡閬撶殑娑堟伅璇︾粏鍐呭鏄寘鍚簡鐗瑰畾娑堟伅鐨勭被鍨嬬殑婧愪唬鐮佸拰澶勭悊鍑芥暟銆?/p>
浼犵粺鎶鏈?/h2>
澶ф搴旂敤寰楁渶涓哄箍娉涚殑娑堟伅浼犻掓妧鏈槸浣跨敤涓涓甫鏈夌壒孌婃垚鍛樻潵琛ㄧず娑堟伅綾誨瀷鐨勭粨鏋勪綋錛岃娑堟伅綾誨瀷鏄秷鎭殑鏍囪瘑銆傝繖縐嶆柟寮忚騫挎硾搴旂敤褰掑拵浜庝嬌鐢ㄤ簡鍩轟簬C鐨凙PI錛屾瘮濡俋11鍜孧icrosoft Windows銆傚湪榪欑鏂規硶涓紝娑堟伅緇撴瀯浣撲腑瑕佷箞鏈変竴涓氱敤鐨勫瓧浣撶敤浜庡尯鍒笉鍚屾秷鎭殑鎰忎箟錛岃繖涓瓧孌靛彲琚墍鏈夋秷鎭噸鐢紝鎴栬呭畠鏄洿澶х粨鏋勭殑絎竴涓垚鍛橈紝瀹冪殑綾誨瀷鐢辯被鍨嬩唬鐮佹潵紜畾銆俉indows API浣跨敤鍓嶉潰鐨勬妧鏈紝鑰孹11浣跨敤鍚庨潰鐨勬柟娉曘傛棤璁虹敤鍝鏂瑰紡錛屽鐞嗘秷鎭殑浠g爜閮介』媯鏌ョ被鍨嬬紪鐮侊紝鐢ㄤ互鍐沖畾鎬庝箞澶勭悊璇ユ秷鎭?/p>
榪欎簺鎶鏈殑闂鏄?緙轟箯綾誨瀷瀹夊叏錛岄泦鎴愮數璺埇鐨勫鐞嗗嚱鏁幫紝闇瑕佺鐞嗙被鍨嬬紪鐮佹潵紜繚娑堟伅鍞竴鎬х殑閫傚綋灞傛銆傜壒鍒殑錛岀己涔忕被鍨嬪畨鍏ㄦ剰鍛崇潃浣跨敤涔嬪墠錛屼嬌鐢ㄤ唬鐮佸繀欏繪妸娑堟伅鏁版嵁杞崲鎴愰傚綋鐨勭被鍨嬨傝繖涓姝ユ槸鏋佹槗鍑洪敊鐨勶紝灝ゅ叾鍦ㄥ綋澶嶅埗鍜岀矘璐翠唬鐮佹椂(榪欑闈炲父鐨勬墜孌靛父鍙戠敓鍦ㄤ負澶勭悊鐩鎬技娑堟伅緙栧啓浠g爜鐨勬椂鍊?錛岀紪璇戝櫒涓嶄細鍦ㄨ繖縐嶉敊璇粰鍑轟換浣曡鍛娿?/p>
緙轟箯綾誨瀷瀹夊叏榪樻湁涓涓澶栫殑闂鈥斺斿嵆瀹冧笉鍙兘綆鍗曟湁鏁堢殑閫氳繃娑堟伅緋葷粺浼犻掕祫婧愭垨鍙橀暱鐨勬暟鎹紝 榪欐槸鍥犱負娑堟伅鐨勫彂閫佹柟鎬繪槸涓嶈兘鐭ラ亾浣曟椂錛堟垨鏄惁錛夎娑堟伅宸茶澶勭悊榪囦簡銆?/p>
鍦ㄨ繖閮ㄥ垎錛岄泦鎴愮數璺埇鐨勬秷鎭鐞嗗嚱鏁版槸蹇呴』鐢ㄤ簬紜畾娑堟伅綾誨瀷鐨勪駭鐗╋紝閫氳繃宸叉帴鏀剁殑娑堟伅鏉ユ秷鎭被鍨嬶紝鐒跺悗寰楀埌濡備綍澶勭悊瀹冪殑鏂瑰紡銆傝繖縐嶅鐞嗗嚱鏁板線寰瀹炵幇涓轟竴涓緢澶х殑switch璇彞鎴栨槸涓涓瞚f eles if銆備竴浜涙鏋訛紝濡侻FC錛屾彁渚涗竴浜涘畯鏉ュ噺寮辮繖縐嶉棶棰樼殑褰卞搷錛屽畠榪欎笉鑳藉畬鍏ㄦ秷闄よ繖涓棶棰樸?/p>
鏈鍚庣殑闂鏄鐞嗙被鍨嬩唬鐮併傚畠蹇呴』瑕佹眰鎺ユ敹娑堟伅浠g爜娓呮鍦扮煡閬撴槸鍝竴涓秷鎭紝浠ヤ究浜庢紜殑澶勭悊瀹冦傛墍浠ワ紝綾誨瀷浠g爜闇瑕佸湪澶勭悊瀹冪殑鐩稿叧浠g爜涓‘淇濆敮涓鎬с傛瘮濡傦紝鍦╓indows API涓紝鎸囧畾鑼冨洿鐨勬秷鎭被鍨嬪湪涓嶅悓鐨勫簲鐢ㄧ▼搴忎腑浠h〃涓嶅悓鐨勬剰涔夛紝騫朵笖錛屽湪鍚屼竴涓簲灝辯敤紼嬪簭涓紝鍏跺畠鑼冨洿鐨勬秷鎭被鍨嬪湪涓嶅悓紿楀彛鎴朑UI緇勪歡涓唬琛ㄤ笉鍚岀殑鎰忎箟銆?閫氬父,闇瑕佹墍鏈夌被鍨嬩唬鐮佺殑鍒楄〃錛岃鍒楄〃瑕佹眰鍦ㄧ粰瀹氱殑鑼冨洿涓繚鎸佸敮涓錛屼互渚夸簬媯鏌ュ畠浠殑鍞竴鎬с傚垪琛ㄥ父甯告槸浠ュご鏂囦歡鐨勫艦寮忕粰鍑猴紝澶存枃浠朵腑瀹氫箟浜嗙被鍨嬩唬鐮侊紝鍖呭惈鍦ㄩ渶瑕佺煡閬撴秷鎭被鍨嬬殑鎵鏈夊湴鏂廣傝繖縐嶆柟寮忓鏄撳鑷村簲鐢ㄧ▼搴忎笉鍚岄儴鍒嗕箣闂寸殑钘曞悎,鑰岃繖浜涢儴鍒嗕箣闂村嵈娌℃湁浠諱綍鍏崇郴銆傜敱浜庤繖縐嶈繃搴︾殑钘曪紝綆鍗曠殑鍙樻洿瀵艱嚧榪囧鐨勯噸鏂扮紪璇戙?/p>
闈㈠悜瀵硅薄鎶鏈?br />
瀵硅薄鎶鏈殑涓涓父瑙佺壒寰佹槸鎵鏈夌浉鍏蟲秷鎭被媧劇敓鑷竴涓氱敤鐨勫熀綾匯傝鐗瑰緛鐢ㄧ紪璇戝櫒鑳借璇嗙殑鐪熷疄綾誨瀷浠f浛浜嗘樉寮忕殑綾誨瀷浠g爜銆備笉浠呭姝わ紝瀹冭繕鏈変簡涓涓噸瑕佺殑錛岃秴瓚奀椋庢牸鎶鏈殑浼樼偣鈥斺旂被鍨嬪畨鍏ㄣ傚畠鎻愪緵鐨勯氱敤鍩虹被鐨勬瀽鏋勫嚱鏁版槸铏氬嚱鏁幫紝鎵浠ユ淳鐢熺殑娑堟伅綾昏兘鑷敱鍦扮鐞嗚祫婧愶紝濡傚彉闀跨殑鏁版嵁錛岃繖浜涙暟鎹彲浠ュ湪鏋愭瀯鍑芥暟涓噴鏀俱備粎鏈夌殑闇姹傛槸鎺ュ彈娑堟伅鐨勪唬鐮佽兘姝g‘鍦伴攢姣佹秷鎭璞★紝鏃犺瀹冧滑鏄惁琚鐞嗐?/p>
綆$悊綾誨瀷浠g爜鐜板湪琚浛鎹負綆$悊綾匯傝繖鏄竴涓洿鍔犵畝鍗曠殑浠誨姟錛岀敱浜庡彲鑳界殑娑堟伅鍚嶅瓧鐨勮寖鍥存槸娌℃湁闄愬埗鐨勶紝鍙兘瀛樺湪鍚嶅瓧鍐茬獊錛屼絾榪欎竴鐐瑰彲浠ラ氳繃鍚嶅瓧絀洪棿鏉ヨВ鍐熾?/p>
淇濇寔綆鍗?/font>
鏈綆鍗曠殑OOP鎶鏈氨鏄敤dynamic_cast媯鏌ュ疄闄呯殑娑堟伅綾誨瀷浠f浛媯鏌ユ秷鎭紪鐮併傜劧鑰岋紝榪欎緷鐒墮潰涓寸潃闆嗘垚鐢佃礬鑸湴娑堟伅澶勭悊鏂瑰紡鈥斺旂幇鍦ㄩ氳繃鍖呮嫭dynamic_cast鐨勬瘮杈冮摼涔熶紭浜庨氳繃綾誨瀷緙栫爜瀛楁姣旇緝閾俱傚鍒楄〃1:
void
聽handleMessage(Message
*
聽message)
{ 聽聽聽聽
if
(Message1
*
聽m
=
dynamic_cast
<
Message1
*>
(message)) 聽聽聽聽
{ 聽聽聽聽聽聽聽聽handleMessage1(m); 聽聽聽聽}
聽聽聽聽
else
聽
if
(Message2
*
聽m
=
dynamic_cast
<
Message2
*>
(message)) 聽聽聽聽
{ 聽聽聽聽聽聽聽聽handleMessage2(m); 聽聽聽聽}
聽聽聽聽
//
聽
}
[鍒楄〃1]
涓鑸岃█錛岀敱浜庝粎浠呮槸娑堟伅鐨勬簮浠g爜鍜屾帴鍙楁秷鎭殑婧愪唬鐮侀渶姹傜煡閬撶浉鍏崇殑娑堟伅錛屾墍浠ヤ緷璧栧緱鍒伴檷浣庛傜劧鍚庯紝闆嗘垚鐢佃礬鑸湴澶勭悊鍑芥暟鐜板湪闇瑕佺煡閬撴秷鎭殑鏈夊叧緇嗚妭錛屾墍浠ynamic_cast闇瑕佹秷鎭殑瀹屾暣瀹氫箟鈥斺斿鏋滃垎媧劇粰鍙﹀鐨勫嚱鏁板鐞嗗疄闄呯殑娑堟伅錛孋椋庢牸鎶鏈殑澶勭悊鍑芥暟涓嶉渶姹傜煡閬撴秷鎭殑緇嗚妭銆?/p>
鍙岄噸鍒嗘淳
(Direct testing of a class's type using dynamic_cast is generally indicative of a design problem;)綾葷殑綾誨瀷鐢╠ynamic_cast鐨勭洿嫻嬭瘯涓鑸彲琛ㄧず涓鴻璁¢棶棰?鐒惰岋紝綆鍗曞湴鎶婅櫄鍑芥暟鏀懼湪娑堟伅綾諱腑璧蜂笉鍒頒換浣曚綔鐢ㄢ斺斿畠灝嗘妸娑堟伅澶勭悊涓庢秷鎭紶緇曞湪涓璧鳳紝榪欎釜娑堟伅浣垮湪絎竴涓湴鏂瑰彂閫佹秷鎭殑鐩殑澶辮觸銆?/p>
鍙岄噸鍒嗘淳鐨勫叧閿偣鏄紝鍦ㄦ秷鎭被涓殑铏氬嚱鏁板甫鏈変竴涓綔涓哄弬鏁扮殑澶勭悊鍣紝鐒跺悗鍦ㄥ鐞嗗櫒涓婃妸鑷凡浣滀負鍙傛暟浼犻掍紶閫掔粰鍙︿竴涓嚱鏁板茍瀹屾垚璋冪敤銆傚洜涓鴻繖閲岀殑絎簩嬈″埌澶勭悊鍣ㄧ殑鍥炶皟宸茬粡鍦ㄥ疄闄呯殑媧劇敓綾諱腑瀹屾垚錛屾墍浠ョ湡瀹炵殑娑堟伅綾誨瀷宸茬粡鐭ラ亾錛屽湪澶勭悊鍣ㄤ笂鑳借皟鐢ㄩ傚綋鐨勫嚱鏁幫紝鏃犺榪欎釜鍑芥暟鏄氳繃閲嶈澆鐨勬柟寮忓疄鐜拌繕鏄彟澶栫嫭绔嬪懡鍚嶇殑鍑芥暟鏉ュ疄鐜?鍒楄〃2)銆?/p>
class
聽Message {
public
: 聽聽聽聽
virtual
聽
void
聽dispatch(MessageHandler
*
聽handler)
=
0
; };
class
聽Message1: 聽聽聽聽
public
聽Message { 聽聽聽聽
void
聽dispatch(MessageHandler
*
聽handler) 聽聽聽聽{ 聽聽聽聽聽聽聽聽handler
->
process(
this
); 聽聽聽聽} };
class
聽Message2: 聽聽聽聽
public
聽Message { 聽聽聽聽
void
聽dispatch(MessageHandler
*
聽handler) 聽聽聽聽{ 聽聽聽聽聽聽聽聽handler
->
process(
this
); 聽聽聽聽} };
//
聽other聽message聽classes
class
聽MessageHandler { 聽聽聽聽
void
聽process(Message1
*
); 聽聽聽聽
void
聽process(Message2
*
); 聽聽聽聽
//
聽overloads聽of聽process聽for聽other聽messages
};
[鍒楄〃2]
渚濊禆浜庨噸杞界殑鏂瑰紡鏉ュ尯鍒笉鍚岀殑娑堟伅鏈夊埄浜庡ぇ澶氭暟騫寵 鈥斺旂幇鍦ㄥ湪姣忎釜娑堟伅綾諱腑铏氬嚱鏁扮殑瀹炵幇鏂瑰紡鏄浉鍚岀殑錛屽鏋滈渶瑕侊紝鍙互閫氳繃瀹忔潵涓鑷村湴鍖呰錛屾垨閫氳繃浠庝竴涓秷鎭埌鍙︿竴涓秷鎭腑鐩存帴澶嶅埗錛屼笉浼氭湁鍑洪敊鐨勬満浼氥?/p>
鍙岄噸鍒嗘淳瀛樺湪涓涓己鐐光斺旈珮搴﹁棔鍚堛傜敱浜庨氳繃閲嶈澆鏂瑰紡鍦ㄥ鐞嗗櫒綾諱腑鐨勯夋嫨澶勭悊鍑芥暟錛屽湪娑堟伅綾諱腑铏氬嚱鏁扮殑瀹炵幇闇瑕佺煡閬撳鐞嗗櫒綾葷殑瀹氫箟鐨勫叏閮紝鍥犳蹇呴』娉ㄦ剰鍒板湪緋葷粺涓瘡涓叾瀹冪殑綾葷殑鍚嶅瓧銆備笉鍏夎繖浜涳紝濡傛灉瑕佹敮鎸佷笉鍚岀殑澶勭悊鍣ㄧ被錛屽鐞嗗嚱鏁板繀欏誨湪閫氱敤鐨勫鐞嗗櫒鐨勫熀綾諱腑澹版槑涓鴻櫄鍑芥暟錛屾墍浠ユ瘡涓鐞嗗櫒綾誨繀欏誨湪緋葷粺涓敞鎰忓埌鎵鏈夌殑娑堟伅綾誨瀷(鍒楄〃3)銆傚鍔犳垨鍒犻櫎涓涓秷鎭被鍨嬩細寮曡搗搴旂敤紼嬪簭澶ч儴鍒嗕唬鐮侀噸鏂扮紪璇戙?/p>
class
聽MessageHandler
{ 聽聽聽聽
virtual
聽
void
聽process(Message1
*
)
=
0
; 聽聽聽聽
virtual
聽
void
聽process(Message2
*
)
=
0
; 聽聽聽聽
virtual
聽
void
聽process(Message3
*
)
=
0
; 聽聽聽聽
virtual
聽
void
聽process(Message4
*
)
=
0
; 聽聽聽聽
//
聽overloads聽of聽process聽for聽other聽messages
}
;
class
聽SpecificMessageHandler: 聽聽聽聽
public
聽MessageHandler
{ 聽聽聽聽
void
聽process(Message1
*
); 聽聽聽聽
void
聽process(Message2
*
); 聽聽聽聽
void
聽process(Message3
*
); 聽聽聽聽
void
聽process(Message4
*
); 聽聽聽聽
//
聽overloads聽of聽process聽for聽other聽messages
}
;
class
聽OtherSpecificMessageHandler: 聽聽聽聽
public
聽MessageHandler
{ 聽聽聽聽
void
聽process(Message1
*
); 聽聽聽聽
void
聽process(Message2
*
); 聽聽聽聽
void
聽process(Message3
*
); 聽聽聽聽
void
聽process(Message4
*
); 聽聽聽聽
//
聽overloads聽of聽process聽for聽other聽messages
}
;
[鍒楄〃3]鍔ㄦ佸弻閲嶅垎媧?br /> 錛圛t was against this backdrop that I developed the technique I call "Dynamic Double Dispatch."錛夋垜寮鍙戜簡涓縐嶆妧鏈紝鎴戠О鍏朵負鈥滃姩鎬佸弻閲嶅垎媧鋸濓紝榪欑鎶鏈敤浜庤В鍐充笂榪伴棶棰樸傚敖綆℃湁鍩烘湰鐨勫弻閲嶅垎媧炬妧鏈紝浣嗛夋嫨鐨勬秷鎭鐞嗗嚱鏁頒嬌鐢ㄧ殑鏄湪緙栬瘧闃舵紜畾鐨勯噸杞芥妧鏈?灝界鍙戠幇鍦ㄦ紜殑娑堟伅澶勭悊鍣ㄧ被涓殑瀹炵幇鏄嬌鐢ㄨ櫄鍑芥暟鏈哄埗),鑰屽姩鎬佸弻閲嶅垎媧炬槸鍦ㄨ繍琛屾椂媯鏌ュ湪澶勭悊鍣ㄤ笂閫傚綋鐨勫鐞嗗嚱鏁扮殑銆傜粨璁烘槸鍔ㄦ佸弻閲嶅垎媧炬秷闄や簡鍙岄噸鍒嗘淳鐨勪緷璧栭棶棰樸傛秷鎭被鍨嬩笉鍦ㄩ渶瑕佹敞鎰忓埌鍏跺畠鐨勬秷鎭被鍨嬶紝騫朵笖澶勭悊鍣ㄧ被浠呴渶瑕佹敞鎰忓埌瀹冪殑瀹冭澶勭悊鐨勬秷鎭?/p>
鍔ㄦ佹鏌ョ殑鍏抽敭鐐規槸錛氭瘡涓涓秷鎭被鍨嬫湁涓涓嫭绔嬬殑鍩虹被鈥斺斿鐞嗗櫒綾諱粠閫傚綋鐨勶紝璁捐涓哄鐞嗘秷鎭殑鍩虹被媧劇敓銆傜劧鍚庡湪姣忎釜娑堟伅綾諱腑鐨勫垎媧懼嚱鏁拌兘鐢╠ynamic_cast鏉ユ鏌ヤ粠姝f淳鍩虹被媧劇敓鐨勫鐞嗗櫒綾伙紝鍥犺屽疄鐜頒簡姝g‘鐨勫鐞嗗嚱鏁般?鍒楄〃4)
class
聽MessageHandlerBase {};
class
聽Message1HandlerBase: 聽聽聽聽
public
聽
virtual
聽MessageHandlerBase { 聽聽聽聽
virtual
聽
void
聽process(Message1
*
)
=
0
; };
class
聽Message1 { 聽聽聽聽
void
聽dispatch(MessageHandlerBase
*
聽handler) 聽聽聽聽{ 聽聽聽聽聽聽聽聽dynamic_cast
<
Message1HandlerBase
&>
(
*
handler).process(
this
); 聽聽聽聽} };
class
聽Message2HandlerBase: 聽聽聽聽
public
聽
virtual
聽MessageHandlerBase { 聽聽聽聽
virtual
聽
void
聽process(Message2
*
)
=
0
; };
class
聽Message2: 聽聽聽聽
public
聽MessageBase { 聽聽聽聽
void
聽dispatch(MessageHandlerBase
*
聽handler) 聽聽聽聽{ 聽聽聽聽聽聽聽聽dynamic_cast
<
Message2HandlerBase
&>
(
*
handler).process(
this
); 聽聽聽聽} };
//
聽
class
聽SpecificMessageHandler: 聽聽聽聽
public
聽Message1HandlerBase, 聽聽聽聽
public
聽Message2HandlerBase { 聽聽聽聽
void
聽process(Message1
*
); 聽聽聽聽
void
聽process(Message2
*
); };
class
聽OtherSpecificMessageHandler: 聽聽聽聽
public
聽Message3HandlerBase, 聽聽聽聽
public
聽Message4HandlerBase { 聽聽聽聽
void
聽process(Message3
*
); 聽聽聽聽
void
聽process(Message4
*
); };
[鍒楄〃4]
(Of course, having a completely separate handler base class for each message type would add excessive complication, as the dispatch function for each message type would now be specific to that message type, and the base classes would have to be written separately, despite being fundamentally the same, except for the message type they referenced.) 璇氱劧錛屼負姣忎釜娑堟伅綾誨瀷鍒嗗埆緙栧啓鐨勫鐞嗗櫒鍩虹被灝嗗鍔犺繃澶氱殑澶嶆潅鎬э紝鍚屾牱鍦幫紝姣忎釜娑堟伅綾誨瀷鍚勮嚜鐨勫垎媧懼嚱鏁扮幇鍦ㄩ渶瑕佺壒鍒寚瀹氾紝鍩虹被涔熼渶姹傚垎鍒紪鍐?鐒跺悗闄や簡瀹冧滑寮曠敤鐨勬秷鎭被鍨嬪鍩虹鏄浉鍚岀殑銆傛秷闄よ繖縐嶉噸澶嶇殑鍏抽敭鏄嬌鍩虹被鎴愪負妯℃澘錛岀敤娑堟伅綾誨瀷浣滀負妯℃澘鍙傛暟鈥斺斿垎媧懼嚱鏁板紩鐢ㄥ埌妯℃澘鐨勫疄鐜板ソ浜庢寚瀹氱被鍨嬶紱璇風湅鍒楄〃5銆?/p>
聽
template
<
typename聽MessageType
>
class
聽MessageHandler: 聽聽聽聽
public
聽
virtual
聽MessageHandlerBase { 聽聽聽聽
virtual
聽
void
聽process(MessageType
*
)
=
0
; };
class
聽Message1 { 聽聽聽聽
void
聽dispatch(MessageHandlerBase
*
聽handler) 聽聽聽聽{ 聽聽聽聽聽聽聽聽dynamic_cast
<
MessageHandler
<
Message1
>&>
(
*
handler).process(
this
); 聽聽聽聽} };
class
聽SpecificMessageHandler: 聽聽聽聽
public
聽MessageHandler
<
Message1
>
, 聽聽聽聽
public
聽MessageHandler
<
Message2
>
{ 聽聽聽聽
void
聽process(Message1
*
); 聽聽聽聽
void
聽process(Message2
*
); };
[鍒楄〃5] 鍑轟簬綆鍖栧師鍥狅紝鍦ㄦ秷鎭被涓殑鍒嗘淳鍑芥暟鍑犱箮鐩稿悓錛屼絾涔熶笉鏄畬鍏ㄧ浉鍚屸斺斿畠浠繀欏繪槑紜殑鎸囧畾灞炰簬瀹冧滑鐨勬寚瀹氭秷鎭被錛屼互渚夸簬杞崲涓洪傚綋鐨勫鐞嗗櫒鍩虹被銆傚儚杞歡涓澶氫簨鎯呬竴鏍鳳紝榪欎釜闂鍙互澧炲姞涓涓澶栫殑灞傛潵瑙e喅鈥斺斿垎媧懼嚱鏁板彲浠ュ鎵樼粰鍗曚釜妯℃澘鍑芥暟錛岃繖涓ā鏉垮嚱鏁頒嬌鐢ㄦā鏉垮弬鏁扮被鍨嬫潵紜畾娑堟伅綾誨瀷鍜屾妸澶勭悊鍣ㄨ漿鎹㈠埌閫傚綋鐨勭被鍨嬩笂銆?鍒楄〃6)
聽
class
聽Message {
protected
: 聽聽聽聽template
<
typename聽MessageType
>
聽聽聽聽
void
聽dynamicDispatch(MessageHandlerBase
*
聽handler,MessageType
*
聽self) 聽聽聽聽{ 聽聽聽聽聽聽聽聽dynamic_cast
<
MessageHandler
<
MessageType
>&>
(
*
handler).process(self); 聽聽聽聽} };
class
聽Message1: 聽聽聽聽
public
聽MessageBase { 聽聽聽聽
void
聽dispatch(MessageHandlerBase
*
聽handler) 聽聽聽聽{ 聽聽聽聽聽聽聽聽dynamicDispatch(handler,
this
); 聽聽聽聽} };
[鍒楄〃6]
閫氳繃榪涗竴姝ユ娊璞″湪娑堟伅瀵硅薄涓垎媧懼嚱鏁扮殑涓嶅悓涔嬪,鎴戜滑鎶婂伐浣滈泦涓埌涓涓湴鏂光斺旀ā鏉垮嚱鏁扮殑瀹氫箟錛涘畠鎻愪緵浜嗕負淇敼琛屼負鐨勫崟涓鐐廣傚湪娑堟伅綾諱腑鍓╀笅鐨勫垎媧懼嚱鏁伴兘鏄浉鍚岀殑錛岃繖瓚充互鎶婂畠浠畝鍖栧埌闅愯棌緇嗚妭鐨勫畯涓垨鍦ㄦ秷鎭被涔嬮棿涓愬瓧澶嶅埗銆?/p>
鏈鐞嗙殑娑堟伅
榪勪粖涓烘錛屾垜浠睍紺虹殑 dynamicDispach妯℃澘鍑芥暟鐨勪唬鐮佸亣瀹氬鐞嗙殑綾繪槸浠庨傚綋鐨凷pecificMessageHandler鏄淳鐢熺殑錛涘鏄笉鏄繖鏍鳳紝 dynamic_cast灝嗘姏鍑簊td::bad_cast寮傚父銆傛湁鏃惰繖灝辮凍澶熶簡錛屼絾鏄湁鐨勬椂鍊欙紝鏈夋洿閫傚綋鐨勮涓衡斺斾篃璁告洿濂界殑鍋氭硶鏄姏寮冩秷鎭紝榪欎笉鑳借鎺ュ彈娑堟伅鐨勪唬鐞嗗鐞嗘垨璋冪敤catch-all澶勭悊鍣ㄣ備婦渚嬫潵璇達紝dynamicDispatch 鍑芥暟鑳借璋冩暣錛岀敤鍩轟簬鎸囬拡鐨勮漿鎹唬鏇垮熀浜庡紩鐢ㄧ殑杞崲錛屾墍浠ョ粨鏋滃煎彲浠ヤ笌NULL榪涜嫻嬭瘯銆?/p>
緙虹偣(Trade-Off)鍦ㄥ摢閲岋紵
鏈夊姝ゅ鐨勪紭鐐癸紝涓瀹氬瓨鍦ㄥ畠鐨勭己鐐癸紝閭e畠鐨勭己鐐瑰湪鍝噷鍛紵鍦ㄨ繖閲岋紝鏈変袱涓己鐐廣傜涓涓槸錛氶澶栫殑鍔ㄦ佽漿鎹紝涓や釜铏氬嚱鏁拌皟鐢ㄤ細褰卞搷鎬ц兘銆傚鏋滄ц兘涓婃槸涓涓棶棰橈紝榪欏氨鏄竴涓枒闂紝浣嗘槸錛屽湪寰堝鎯呭喌涓嬶紝鑺遍攢鍦ㄨ繖閲岀殑棰濆鐨勬椂闂存槸涓嶅煎緱鍏蟲敞鐨勩傚彲浠ヤ嬌鐢ㄧ浉搴旂殑宸ュ叿鏉ョ瀹氬埌搴曞摢閲屾墠鏄湡姝g殑鎬ц兘鐡墮鎵鍦ㄣ?/p>
絎簩涓己鐐規槸:闇瑕佷負姣忎釜娑堟伅澶勭悊浠庢寚瀹氱殑鍩虹被媧劇敓娑堟伅澶勭悊鍣ㄣ傚洜涓哄鐞嗘柊鐨勬秷鎭被鍨嬮渶瑕佷慨鏀逛袱涓湴鏂光斺旈傚綋鐨勫熀綾誨垪琛ㄥ叆鍙e拰澶勭悊鍑芥暟錛屾墍浠ヨ繖鍙兘鎴愪負閿欒鐨勬潵婧愶紝閬楀け澶勭悊鍑芥暟瀹規槗琚彂鐜幫紝鍥犱負榪欐槸鍏ㄥ眬鐐癸紝浣嗘槸閬楀け鍩虹被鍦ㄤ唬鐮佽繍琛屾椂鍙駭鐢熶笉鏄撴煡瑙夌殑緙洪櫡銆傚洜涓烘病鏈夊鐞嗗嚱鏁扮殑鏃跺欎粎浠呮槸涓嶈皟鐢ㄥ畠銆傝繖浜涢敊璇湪鍗曞厓嫻嬭瘯鐨勬椂鍊欐槸寰堝鏄撹鎶撳嚭鏉ョ殑錛屾墍浠ユ墍瀹炶瘽錛岃繖浜涗笉渚夸箣澶勯兘鎴愪笉浜嗗ぇ闂銆?/p>
聽
]]>socket緙栫▼錛歋O_REUSEADDR渚嬭В (杞? http://www.shnenglu.com/ace/archive/2006/04/29/6446.htmlStone Jiang Stone Jiang Sat, 29 Apr 2006 01:40:00 GMT http://www.shnenglu.com/ace/archive/2006/04/29/6446.html http://www.shnenglu.com/ace/comments/6446.html http://www.shnenglu.com/ace/archive/2006/04/29/6446.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/6446.html http://www.shnenglu.com/ace/services/trackbacks/6446.html 闃呰鍏ㄦ枃 ]]> 璋堣皥C++緇ф壙涓殑閲嶈澆錛岃鐩栧拰闅愯棌 (杞? http://www.shnenglu.com/ace/archive/2006/04/25/6243.htmlStone Jiang Stone Jiang Tue, 25 Apr 2006 05:29:00 GMT http://www.shnenglu.com/ace/archive/2006/04/25/6243.html http://www.shnenglu.com/ace/comments/6243.html http://www.shnenglu.com/ace/archive/2006/04/25/6243.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/6243.html http://www.shnenglu.com/ace/services/trackbacks/6243.html
聽
聽
聽聽聽聽聽 鍐欐棰樹箣鍓嶏紝鍏堢粰鍑哄嚑涓叧閿瓧鐨勪腑鑻辨枃瀵圭収錛岄噸杞?overload)錛岃鐩?override),闅愯棌(hide)銆傚湪鏃╂湡鐨凜++涔︾睄涓紝鍙兘緲昏瘧鐨勪漢涓嶇啛鎮変笓涓氱敤璇紙涔熶笉鑳芥粬浠紝浠栦滑涓嶆槸鎼炶綆楁満緙栫▼鐨勶紝浠栦滑鏄嫳璇笓涓氱殑錛夛紝甯稿父鎶婇噸杞?overload)鍜岃鐩?override)鎼為敊錛?/p>
銆銆鎴戜滑鍏堟潵鐪嬩竴浜涗唬鐮佸強鍏剁紪璇戠粨鏋溿?/p>
銆銆瀹炰緥涓錛?br />銆銆 銆銆#include "stdafx.h" 銆銆#include <iostream.h>
銆銆class CB 銆銆{ 銆銆public: 聽銆銆銆銆void f(int) 聽銆銆銆銆{ 聽銆銆銆銆銆銆聽cout << "CB::f(int)" << endl; 銆銆銆銆聽}
銆銆};
銆銆class CD : public CB 銆銆{ 銆銆public: 銆銆銆銆聽void f(int,int) 聽銆銆銆銆{ 聽聽銆銆銆銆銆銆cout << "CD::f(int,int)" << endl; 聽銆銆銆銆}
聽銆銆銆銆void test() 聽銆銆銆銆{ 聽聽銆銆銆銆銆f(1); 聽銆銆銆銆} 銆銆};
銆int main(int argc, char* argv[]) 銆{ 銆銆銆聽return 0; 銆} 緙栬瘧浜嗕竴涓?br />error C2660: 'f' : function does not take 1 parameters
緇撹錛氬湪綾籆D榪欎釜鍩熶腑錛屾病鏈塮(int)榪欐牱鐨勫嚱鏁幫紝鍩虹被涓殑void f(int)琚?font color="#ff0000">闅愯棌
銆銆濡傛灉鎶婃淳鐢烠D涓垚鍛樺嚱鏁皏oid f(int,int)鐨勫0鏄庢敼鎴愬拰鍩虹被涓竴鏍鳳紝鍗砯(int)錛屽熀綾諱腑鐨剉oid f(int)榪樻槸涓鏍瘋瑕嗙洊錛屾鏃剁紪璇戜笉浼氬嚭閿欙紝鍦ㄥ嚱鏁頒腑test璋冪敤鐨勬槸CD涓殑f(int)銆
銆銆鎵浠ワ紝鍦?font color="#ff0000">鍩虹被涓?/font>鐨勬煇浜涘嚱鏁幫紝濡傛灉娌℃湁 virtral 鍏抽敭瀛楋紝鍑芥暟鍚嶆槸f( 鍙傛暟鏄粈涔堟垜浠笉綆?錛岄偅涔堝鏋滃湪媧劇敓綾籆D涓?font color="#ff0000">涔熷0鏄庝簡鏌愪釜f鎴愬憳鍑芥暟錛岄偅涔堝湪綾籆D鍩熶腑錛?font color="#ff0000">鍩虹被涓墍鏈夌殑閭d簺f閮借闅愯棌銆?/font> 銆銆濡傛灉浣犳瘮杈冨績鎬ワ紝鎯崇煡閬撲粈涔堟槸闅愯棌錛岀湅鏂囩珷鏈鍚庣殑綆鍗曡鏄庯紝涓嶈繃鎴戝緩璁綘榪樻槸涓姝ヤ竴姝ョ湅涓嬪幓銆?/p>
銆銆鎴戜滑鍒氭墠璇寸殑鏄病鏈塿irtual鐨勬儏鍐碉紝濡傛灉鏈塿irtual鐨勬儏鍐靛憿錛燂紵 銆銆瀹炰緥浜岋細
#include "stdafx.h" #include <iostream.h>
class CB { public: 聽銆銆virtual void f(int) 聽銆銆{ 聽聽銆銆銆銆cout << "CB::f(int)" << endl; 聽銆銆}
};
class CD : public CB { public: 銆銆聽void f(int) 聽銆銆{ 聽聽銆銆銆銆cout << "CD::f(int)" << endl; 銆銆聽}
};
int main(int argc, char* argv[]) { 聽銆return 0; }
銆銆榪欎箞鍐欏綋鐒舵槸娌¢棶棰樹簡錛屽湪榪欓噷鎴戜笉澶氳垂鍙h垖浜嗭紝榪欐槸寰堢畝鍗曠殑錛屽鎬侊紝铏氬嚱鏁幫紝鐒跺悗浠涔堟寚鍚戝熀綾葷殑鎸囬拡鎸囧悜媧劇敓綾誨璞¢樋錛岄氳繃寮曠敤璋冪敤铏氬嚱鏁伴樋浠涔堢殑錛屽睘鎬у鐨勫緢鍜紝浠涔堬紵錛熶綘涓嶆槑鐧斤紵錛熼殢渚挎壘鏈珻++鐨勪功錛屽浼氳澶氭佸拰铏氬嚱鏁版満鍒剁殑鍝︼紒錛?br />銆銆榪欑鎯呭喌鎴戜滑鍙?font color="#ff0000">瑕嗙洊(override)錛?/font>瑕嗙洊鎸囩殑鏄淳鐢熺被鐨勮櫄鎷熷嚱鏁拌鐩栦簡鍩虹被鐨勫悓鍚嶄笖鍙傛暟鐩稿悓鐨勫嚱鏁幫紒 銆銆鍦ㄨ繖閲岋紝鎴戣寮鴻皟鐨勬槸錛岃繖縐嶈鐩栵紝瑕佹弧瓚充袱涓潯浠?br />銆(a) 鏈塿irtual鍏抽敭瀛?/font>錛屽湪鍩虹被涓嚱鏁板0鏄庣殑鏃跺欏姞涓婂氨鍙互浜?br />銆(b) 鍩虹被CB涓殑鍑芥暟鍜屾淳鐢熺被CD涓殑鍑芥暟瑕佷竴妯′竴鏍?/font>錛屼粈涔堝彨涓妯′竴鏍鳳紝鍑芥暟鍚嶏紝鍙傛暟錛岃繑鍥炵被鍨嬩笁涓潯浠?/font>銆?br />銆銆鏈変漢鍙兘浼氬(b)涓殑璇存硶璐ㄧ枒錛岃榪斿洖綾誨瀷涔熻涓鏍鳳紵錛?br />銆銆鏄紝瑕嗙洊鐨勮瘽蹇呴』涓鏍鳳紝鎴戣瘯浜嗚瘯錛屽鏋滃湪鍩虹被涓?鎶奻鐨勫0鏄庢敼鎴恦irtual int f(int)錛岀紪璇戝嚭閿欎簡 銆銆error C2555: 'CD::f' : overriding virtual function differs from 'CB::f' only by return type or calling convention 銆銆鎵浠ワ紝瑕嗙洊鐨勮瘽錛屽繀欏昏婊¤凍涓婅堪鐨?a)(b)鏉′歡
銆銆閭d箞濡傛灉鍩虹被CB涓殑鍑芥暟f鏈夊叧閿瓧virtual銆錛屼絾鏄弬鏁板拰媧劇敓綾籆D涓殑鍑芥暟f鍙傛暟涓嶄竴鏍峰憿錛?br />瀹炰緥涓? 聽 #include "stdafx.h" #include <iostream.h>
class CB { 銆public: 聽銆銆 virtual聽 void f(int) 銆銆聽{ 聽銆銆銆銆聽cout << "CB::f(int)" << endl; 銆銆聽}
} ;
class CD : public CB { public: 聽銆銆 void f(int錛宨nt) 聽銆銆{ 聽銆銆銆聽cout << "CD::f(int錛宨nt)" << endl; 聽銆銆}
聽銆銆void test() 聽銆銆{ 聽銆銆銆銆聽f(1); 聽銆銆} } ;
int main(int argc, char* argv[]) { 聽return 0; }
緙栬瘧鍑洪敊浜嗭紝 聽error C2660: 'f' : function does not take 1 parameters 銆銆鍜︼紵錛熷ソ闈㈢啛鐨勯敊錛燂紵瀵癸紝鍜屽疄渚嬩竴涓殑鎯呭喌涓鏍峰摝錛岀粨璁轟篃鏄熀綾諱腑鐨勫嚱鏁拌闅愯棌浜嗐?/p>
銆銆閫氳繃涓婇潰涓変釜渚嬪瓙錛屽緱鍑轟竴涓畝鍗曠殑緇撹 濡傛灉鍩虹被涓殑鍑芥暟鍜屾淳鐢熺被涓殑涓や釜鍚嶅瓧涓鏍風殑鍑芥暟f 婊¤凍涓嬮潰鐨勪袱涓潯浠?br />(a)鍦ㄥ熀綾諱腑鍑芥暟澹版槑鐨勬椂鍊欐湁virtual鍏抽敭瀛?br />(b)鍩虹被CB涓殑鍑芥暟鍜屾淳鐢熺被CD涓殑鍑芥暟涓妯′竴鏍鳳紝鍑芥暟鍚嶏紝鍙傛暟錛岃繑鍥炵被鍨嬮兘涓鏍楓?br />閭d箞榪欏氨鏄彨鍋?font color="#ff0000">瑕嗙洊(override)錛?/font>榪欎篃灝辨槸铏氬嚱鏁幫紝澶氭佺殑鎬ц川
閭d箞鍏朵粬鐨勬儏鍐靛憿錛燂紵鍙鍚嶅瓧涓鏍鳳紝涓嶆弧瓚充笂闈㈣鐩栫殑鏉′歡錛屽氨鏄?font color="#ff0000">闅愯棌 浜嗐?/font>
涓嬮潰鎴戣璁叉渶鍏抽敭鐨勫湴鏂逛簡 錛屽ソ澶氫漢璁や負錛屽熀綾籆B涓殑f(int)浼氱戶鎵夸笅鏉ュ拰CD涓殑f(int,int)鍦ㄦ淳鐢熺被CD涓瀯鎴愰噸杞斤紝灝卞儚瀹炰緥涓涓兂鍍忕殑閭f牱銆?br />銆銆瀵瑰悧錛熸垜浠厛鐪嬮噸杞界殑瀹氫箟 銆銆閲嶈澆(overload): 銆銆蹇呴』鍦ㄤ竴涓煙涓?鍑芥暟鍚嶇О鐩稿悓浣嗘槸鍑芥暟鍙傛暟涓嶅悓,閲嶈澆鐨勪綔鐢ㄥ氨鏄悓涓涓嚱鏁版湁涓嶅悓鐨勮涓?鍥犳涓嶆槸鍦ㄤ竴涓煙涓殑鍑芥暟鏄棤娉曟瀯鎴愰噸杞界殑,榪欎釜鏄噸杞界殑閲嶈鐗瑰緛 銆銆蹇呴』鍦ㄤ竴涓煙涓?/font>錛岃岀戶鎵挎槑鏄炬槸鍦ㄤ袱涓被涓簡鍝︼紝鎵浠ヤ笂闈㈢殑鎯蟲硶鏄笉鎴愮珛鐨勶紝鎴戜滑嫻嬭瘯鐨勭粨鏋勪篃鏄繖鏍鳳紝媧劇敓綾諱腑鐨刦(int,int)鎶婂熀綾諱腑鐨刦(int)闅愯棌浜?br />銆銆鎵浠ワ紝鐩稿悓鐨勫嚱鏁板悕鐨勫嚱鏁幫紝鍦ㄥ熀綾誨拰媧劇敓綾諱腑鐨勫叧緋誨彧鑳芥槸瑕嗙洊鎴栬呴殣钘忋?/font>
銆銆鍦ㄦ枃绔犱腑錛屾垜鎶婇噸杞藉拰瑕嗙洊鐨勫畾涔夐兘緇欎簡鍑烘潵浜嗭紝浣嗘槸涓鐩存病鏈夌粰闅愯棌鐨勫畾涔夛紝鍦ㄦ渶鍚庯紝鎴戞妸浠栫粰鍑烘潵錛岃繖孌佃瘽鏄綉涓奼oogle鏉ョ殑錛屾瘮杈冮暱錛屼綘鍙互綆鍗曠殑鐞嗚В鎴愶紝鍦ㄦ淳鐢熺被鍩熶腑錛岀湅涓嶅埌鍩虹被涓殑閭d釜鍚屽悕鍑芥暟浜嗭紝鎴栬呰錛屾槸騫舵病鏈夌戶鎵夸笅鏉ョ粰浣犵敤錛屽懙鍛碉紝濡傚疄渚嬩竴銆閭f牱銆?br />銆銆
闅愯棌(hide): 鎸囩殑鏄淳鐢熺被鐨勬垚鍛樺嚱鏁伴殣钘忎簡鍩虹被鍑芥暟鐨勬垚鍛樺嚱鏁?闅愯棌涓璇嶅彲浠ヨ繖涔堢悊瑙?鍦ㄨ皟鐢ㄤ竴涓被鐨勬垚鍛樺嚱鏁扮殑鏃跺?緙栬瘧鍣ㄤ細娌跨潃綾葷殑緇ф壙閾鵑愮駭鐨勫悜涓婃煡鎵懼嚱鏁扮殑瀹氫箟,濡傛灉鎵懼埌浜嗛偅涔堝氨鍋滄鏌ユ壘浜?鎵浠ュ鏋滀竴涓淳鐢熺被鍜屼竴涓熀綾婚兘鏈夊悓涓涓悓鍚?鏆備笖涓嶈鍙傛暟鏄惁鐩稿悓)鐨勫嚱鏁?鑰岀紪璇戝櫒鏈緇堥夋嫨浜嗗湪媧劇敓綾諱腑鐨勫嚱鏁?閭d箞鎴戜滑灝辮榪欎釜媧劇敓綾葷殑鎴愬憳鍑芥暟"闅愯棌"浜嗗熀綾葷殑鎴愬憳鍑芥暟,涔熷氨鏄瀹冮樆姝簡緙栬瘧鍣ㄧ戶緇悜涓婃煡鎵懼嚱鏁扮殑瀹氫箟
]]> STL涓璵ap涓巋ash_map瀹瑰櫒鐨勯夋嫨 (杞? http://www.shnenglu.com/ace/archive/2006/04/25/6223.htmlStone Jiang Stone Jiang Tue, 25 Apr 2006 01:25:00 GMT http://www.shnenglu.com/ace/archive/2006/04/25/6223.html http://www.shnenglu.com/ace/comments/6223.html http://www.shnenglu.com/ace/archive/2006/04/25/6223.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/6223.html http://www.shnenglu.com/ace/services/trackbacks/6223.html
STL涓璵ap涓巋ash_map瀹瑰櫒鐨勯夋嫨
]]> 綆鍗曡瑙CE_SOCK Wrapper Class鐨勪嬌鐢?鍘熷垱) http://www.shnenglu.com/ace/archive/2006/04/20/5987.htmlStone Jiang Stone Jiang Thu, 20 Apr 2006 15:50:00 GMT http://www.shnenglu.com/ace/archive/2006/04/20/5987.html http://www.shnenglu.com/ace/comments/5987.html http://www.shnenglu.com/ace/archive/2006/04/20/5987.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/5987.html http://www.shnenglu.com/ace/services/trackbacks/5987.html 聽綆鍗曡瑙CE_SOCK Wrapper Class鐨勪嬌鐢?/h1>
Stone Jianghttp://www.shnenglu.com/ace
鎴戜滑鍏堟潵鐪嬩竴涓満鏅?
鎮ㄥ幓涓瀹墮棣嗗悆楗?榪欏槨愰浣嶇疆灝卞湪姘存湪娓呭崕琛?3鍙鳳紱鎮ㄥ緱浜嬪厛鐭ラ亾槨愰鐨勪綅緗紝浠庨棬榪涘叆錛屽鏋滀綘鎯崇牬澧欒屽叆閭f槸涓嶅厑鍙殑銆傚綋浣犺繘闂ㄥ悗錛岄棣嗕細鏈変竴浣嶉浣嶅憳鎷涘懠浣狅紝棰嗕綅鍛樹細瀹夋帓涓涓湇鍔″憳涓轟綘鎻愪緵鏈嶅姟鐨勶紝浣犲彲浠ュ悜鏈嶅姟鍛樼偣鑿滐紝鎴栧惉鍙栨湇鍔″憳鐨勬帹鑽愩傜敤槨愬悗浣犵寮槨愰銆?br />
鍒╃敤ACE SOCK緙栫▼錛屼笌涓婇瀛愭瀬鍏剁浉浼箋傛垜浠潵浣滀竴涓姣斻?br />
槨愰鐨勪綅緗紝鍡紝璁$畻鏈轟笂錛屾垜浠槸IP鍦板潃錛屾按鏈ㄦ竻鍗庢垜浠搴旂殑鏄?smth.org,瀹冪殑闂ㄧ墝鍙峰憿錛屽搴旂殑鏄垜浠殑绔彛鍦板潃錛屽湪ACE涓紝鎴戜滑鐢ˋCE_INET_Addr鏉ヨ〃紺恒?br />
鍗籌紝
ACE_INET_Addr peer_addr;
peer_addr;.set(23,"smth.org");
鎴戜滑涔熷彲浠ョ洿鎺ラ氳繃瀹冪殑甯﹀弬鏁扮殑鏋勯犲嚱鏁版潵澹版槑鍜屽垵濮嬪寲錛?br />
ACE_INET_Addr peer_addr(23,"smth.org")
槨愰鐨勯浣嶅憳鐩稿綋浜?ACE_SOCK_Acceptor,瀹冭鍔ㄧ殑绔欏湪绔欏彛絳夌潃瀹㈡埛鐨勫埌鏉ワ紝鎮ㄤ綔涓哄鎴鳳紝鏄富鍔ㄧ錛孉CE_SOCK_Connector鍒欐槸鎮ㄥ皢鍦ㄤ唬鐮佷腑鐪嬪埌鐨勩?br />
ACE闈㈠悜榪炴帴鐨勭綉緇滅紪紼嬶紝鏈変笁涓富瑕佺殑瑙掕壊
涓誨姩绔?琚姩绔拰鏁版嵁浜ゆ祦鐨勯氶亾錛屽嵆
ACE_SOCK_Acceptor, ACE_SOCK_Connector鍜孉CE_SOCK_Stream
鎺ユ敹鍜屽彂閫佹暟鎹紝鍒欓氳繃 ACE_SOCK_Stream::recv(...)鍜宻end(...)瀹屾垚錛屾湰渚嬫紨紺轟簡鎺ユ敹鏃剁殑璋冪敤銆?br />
瀹屾垚鏁版嵁浜や簰涔嬪悗錛孉CE_SOCK_Stream::close()瀹屾垚鏂紑榪炴帴鎿嶄綔銆?榪欑浉褰撲簬涔板崟璧頒漢銆?br />
娉細smth.org:23鏄按鏈ㄦ竻鍗嶵elnet鏈嶅姟錛屾偍榪樺彲浠ラ氳繃
telnet smth.org鏉ヨ闂?br />
涓嬮潰鏄畬鏁翠唬鐮佺ず渚?VC 7.1涓嬭皟璇曢氳繃// @file:聽mybrowser.cpp // 聽聽聽聽聽聽聽Main聽function // @auth:聽Stone聽Jiang聽<2005119@gmail.com> // @date:聽2006-4-20 #include聽" ace /Log_Msg.h" #include聽" ace /SOCK_Connector.h" #include聽" ace /SOCK_Stream.h" #include聽" ace /INET_Addr.h" int 聽ACE_TMAIN( int 聽argc,聽ACE_TCHAR * 聽argv[]) { 聽聽ACE_DEBUG((LM_DEBUG, " start聽here\n " )); 聽聽 const 聽 char * 聽server_hostname聽 = 聽 " smth.org " ; 聽聽ACE_SOCK_Connector聽connector; 聽聽ACE_SOCK_Stream聽peer; 聽聽ACE_INET_Addr聽peer_addr; 聽聽 char 聽buf[ 64 ] = { 0 }; 聽聽 if (peer_addr. set ( 23 ,server_hostname)聽 == 聽 - 1 ) 聽聽{ 聽聽聽聽聽ACE_ERROR_RETURN((LM_DEBUG, " (%P|%t)聽%p\n " , 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 " Set聽server聽host " ), - 1 ); 聽聽} 聽聽 else 聽 if (connector.connect(peer,peer_addr)聽 == 聽 - 1 ) 聽聽{ 聽聽聽聽ACE_ERROR_RETURN((LM_DEBUG, " (%P|%t)聽%p\n " , 聽聽聽聽聽聽 " Connection " ), - 1 ); 聽聽} 聽聽ACE_DEBUG((LM_DEBUG, " 寤虹珛榪炴帴鎴愬姛聽\n " )); 聽聽 const 聽 int 聽s聽 = 聽 64 聽 * 聽 10 ; 聽聽 int 聽m聽 = 聽 0 ; 聽聽 for (ssize_t聽n;聽(n聽 = 聽peer.recv(buf, sizeof 聽buf)) > 0 ;) 聽聽{ 聽聽聽聽 聽聽聽聽ace ::write_n(ACE_STDOUT,buf,n); 聽聽聽聽m聽 += 聽n; 聽聽聽聽 if (聽m聽 > 聽s) 聽聽聽聽{ 聽聽聽聽聽聽 break ; 聽聽聽聽} 聽聽} 聽聽peer.close(); 聽聽 return 聽 0 ; } ]]> 宸х敤铏氬弸鍏冨嚱鏁?鍘熷垱) http://www.shnenglu.com/ace/archive/2006/04/17/5796.htmlStone Jiang Stone Jiang Mon, 17 Apr 2006 14:12:00 GMT http://www.shnenglu.com/ace/archive/2006/04/17/5796.html http://www.shnenglu.com/ace/comments/5796.html http://www.shnenglu.com/ace/archive/2006/04/17/5796.html#Feedback 3 http://www.shnenglu.com/ace/comments/commentRss/5796.html http://www.shnenglu.com/ace/services/trackbacks/5796.html 鐖剁被鐨勫弸鍏冧笉浼氳嚜鍔ㄦ垚涓哄瓙綾葷殑鍙嬪厓錛涜屼笖鍙嬪厓浼氱牬鍧忓皝瑁咃紱C++鐨勮鏂逛笉鍏佽錛堥潪鎴愬憳錛夊弸鍏冨嚱鏁頒負铏氬嚱鏁般?br />浣嗘槸錛屾煇浜涙椂鍊欙紝蹇呴』閫氳繃鍙嬪厓鎵嶈兘瀹炵幇涓浜涙搷浣滅閲嶈澆錛屽operator<<()錛涘鏋滀負姣忎釜瀛愮被閮藉疄鐜皁perator<<()鍊掓槸涓涓彲琛岀殑鏂規硶錛屼絾鏄樉寰楀緢鍟板棪銆?br /> 濡傛灉鑳芥妸鍙嬪厓瀹氫箟涓鴻櫄鍑芥暟錛屽垯瀛愮被鍙互緇ф壙璇ュ弸鍏冪殑鎺ュ彛鑰屾棤闇閲嶅澹版槑鍙嬪ソ閭h澶氬ソ鍟婏紵 鏈枃鍒欓氳繃涓縐嶅彉閫氱殑鏂規硶宸у杈懼埌铏氬嚱鏁扮殑鏁堟灉銆?br /> //鍩虹被 Base.
#pragma聽once #include聽
<
iostream
>
using
聽
namespace
聽std;
class
聽Base
{
public
: 聽聽Base(
void
); 聽聽
~
Base(
void
);
public
: 聽聽
virtual
聽
void
聽print(ostream
&
聽output)聽
=
聽
0
; 聽聽friend聽ostream
&
聽
operator
聽
<<
(ostream
&
聽output,Base
&
聽obj);
private
: 聽聽
char
*
聽name_; 聽聽
int
聽age_; }
;
鍩虹被鐨勫疄鐜?base.cpp#include聽 " StdAfx.h " #include聽" .\base.h " Base::Base(void ) { 聽聽name_聽 = 聽 " This聽is聽data1 " ; 聽聽age_聽 = 聽 18 ; } Base::~ Base( void ) { } void 聽Base::print(ostream & 聽output) { 聽聽output << " name聽=聽 " 聽 << name_ << endl; 聽聽output << " age聽=聽 " << age_ << endl; } ostream& 聽 operator << (ostream & 聽output,Base & 聽obj) { 聽聽obj.print(output); 聽聽 return 聽output; } 媧劇敓綾葷殑 Derived.h#pragma聽once #include聽 " Base.h " class 聽Derived聽: public 聽Base { public : 聽聽Derived( int 聽score聽 = 聽 80 ); 聽聽 ~ Derived( void ); 聽聽 virtual 聽 void 聽print(ostream & 聽output); private : 聽聽 int 聽score_; } ; 媧劇敓綾葷殑瀹炵幇 Derived.cpp#include聽 " StdAfx.h " #include聽" .\derived.h " Derived::Derived(int 聽score):score_(score) { 聽聽 } Derived::~ Derived( void ) { } void 聽Derived::print(ostream & 聽output) { 聽聽Base::print(output); 聽聽output << " score聽=聽 " << score_ << endl; } 涓葷▼搴弇ain.cpp// 聽Test_VirtualFirendFunction.cpp聽:聽Defines聽the聽entry聽point聽for聽the聽console聽application. // #include聽" stdafx.h " #include聽< iostream > #include聽" Derived.h " using 聽 namespace 聽std; int 聽_tmain( int 聽argc,聽_TCHAR * 聽argv[]) { 聽聽Derived聽聽d; 聽聽Derived聽聽d2( 90 ); 聽聽cout << d << endl << d2 << endl; 聽聽聽聽 return 聽 0 ; } 灞忓箷杈撳叆緇撴灉name聽=聽This聽is聽data1 age聽=聽18 score聽=聽80 name聽=聽This聽is聽data1 age聽=聽18 score聽=聽90 緇撴灉錛?br />浠諱綍浠嶣ase媧劇敓綾葷殑錛岄兘鍙互鍒╃敤cout<<obj鐨勬満鍒墮氳繃嫻佽繘琛岃緭鍑恒?br /> 鍚屾牱閬撶悊錛屼篃鍙互鍒╃敤姝ゆ柟娉曞疄鐜癆CE_InputCDR聽聽/ ACE_OutputCDR瀵圭綉緇滄搷浣滃簭鍒楀寲鎿嶄綔銆?br />(鏈枃涔熸槸鍥炵瓟鏌愮綉鍙嬪叧浜庢淳鐢熺被涓嶈兘閲嶈澆鐨勯棶棰樼殑鍥炲)
]]> C++椋庢牸鐨勭被鍨嬭漿鎹㈢殑鐢ㄦ硶 (杞? http://www.shnenglu.com/ace/archive/2006/04/16/5641.htmlStone Jiang Stone Jiang Sun, 16 Apr 2006 06:21:00 GMT http://www.shnenglu.com/ace/archive/2006/04/16/5641.html http://www.shnenglu.com/ace/comments/5641.html http://www.shnenglu.com/ace/archive/2006/04/16/5641.html#Feedback 1 http://www.shnenglu.com/ace/comments/commentRss/5641.html http://www.shnenglu.com/ace/services/trackbacks/5641.html
C++椋庢牸鐨勭被鍨嬭漿鎹㈢殑鐢ㄦ硶 榪欐槸More聽Effecitve聽C++閲岀殑絎簩鏉″綾誨瀷杞崲璁茬殑寰堝ソ錛屼篃寰堝熀紜濂芥噦銆?br />Item聽M2錛氬敖閲忎嬌鐢–++椋庢牸鐨勭被鍨嬭漿鎹?br />浠旂粏鎯蟲兂鍦頒綅鍗戣幢鐨勭被鍨嬭漿鎹㈠姛鑳斤紙cast錛夛紝鍏跺湪紼嬪簭璁捐涓殑鍦頒綅灝辮薄goto璇彞涓鏍蜂護浜洪剻瑙嗐備絾鏄畠榪樹笉鏄棤娉曚護浜哄繊鍙楋紝鍥犱負褰撳湪鏌愪簺绱ц鐨勫叧澶達紝綾誨瀷杞崲榪樻槸蹇呴渶鐨勶紝榪欐椂瀹冩槸涓涓繀闇鍝併?br />涓嶈繃C椋庢牸鐨勭被鍨嬭漿鎹㈠茍涓嶄唬琛ㄦ墍鏈夌殑綾誨瀷杞崲鍔熻兘銆?br />涓
鏉ュ畠浠繃浜庣矖椴侊紝鑳藉厑璁鎬綘鍦ㄤ換浣曠被鍨嬩箣闂磋繘琛岃漿鎹€備笉榪囧鏋滆榪涜鏇寸簿紜殑綾誨瀷杞崲錛岃繖浼氭槸涓涓紭鐐廣傚湪榪欎簺綾誨瀷杞崲涓瓨鍦ㄧ潃宸ㄥぇ鐨勪笉鍚岋紝渚嬪鎶婁竴涓寚鍚?
聽const瀵硅薄鐨勬寚閽堬紙pointer-to-const-object錛夎漿鎹㈡垚鎸囧悜闈瀋onst瀵硅薄鐨勬寚閽堬紙pointer-to-non
-const聽-object錛?鍗充竴涓粎浠呭幓闄onst鐨勭被鍨嬭漿鎹?錛屾妸涓涓寚鍚戝熀綾葷殑鎸囬拡杞崲鎴愭寚鍚戝瓙綾葷殑鎸囬拡錛堝嵆瀹屽叏鏀瑰彉瀵硅薄綾誨瀷錛夈?
浼犵粺鐨凜椋庢牸鐨勭被鍨嬭漿鎹笉瀵逛笂榪頒袱縐嶈漿鎹㈣繘琛屽尯鍒嗐傦紙榪欎竴鐐逛篃涓嶄護浜烘儕璁訛紝鍥犱負C椋庢牸鐨勭被鍨嬭漿鎹㈡槸涓篊璇█璁捐鐨勶紝鑰屼笉鏄負C++璇█璁捐鐨勶級銆?br />浜?
鏉椋庢牸鐨勭被鍨嬭漿鎹㈠湪紼嬪簭璇彞涓毦浠ヨ瘑鍒傚湪璇硶涓婏紝綾誨瀷杞崲鐢卞渾鎷彿鍜屾爣璇嗙緇勬垚錛岃岃繖浜涘彲浠ョ敤鍦–錛嬶紜涓殑浠諱綍鍦版柟銆傝繖浣垮緱鍥炵瓟璞¤繖鏍蜂竴涓渶鍩烘湰鐨勬湁
鍏崇被鍨嬭漿鎹㈢殑闂鍙樺緱寰堝洶闅撅細鈥滃湪榪欎釜紼嬪簭涓槸鍚︿嬌鐢ㄤ簡綾誨瀷杞崲錛熲濄傝繖鏄洜涓轟漢宸ラ槄璇誨緢鍙兘蹇界暐浜嗙被鍨嬭漿鎹㈢殑璇彞錛岃屽埄鐢ㄨ薄grep鐨勫伐鍏風▼搴忎篃涓嶈兘浠?
璇彞鏋勬垚涓婂尯鍒嗗嚭瀹冧滑鏉ャ?br />C++閫氳繃寮曡繘鍥涗釜鏂扮殑綾誨瀷杞崲鎿嶄綔絎﹀厠鏈嶄簡C椋庢牸綾誨瀷杞崲鐨勭己鐐癸紝榪欏洓涓搷浣滅鏄?聽
static_cast,聽const_cast,聽dynamic_cast,聽鍜宺einterpret_cast銆?
鍦ㄥぇ澶氭暟鎯呭喌涓嬶紝瀵逛簬榪欎簺鎿嶄綔絎︿綘鍙渶瑕佺煡閬撳師鏉ヤ綘涔犳儻浜庤繖鏍峰啓錛?br />(type)聽expression 鑰岀幇鍦ㄤ綘鎬誨簲璇ヨ繖鏍峰啓錛?br />static_cast
<
type
>
(expression) 渚嬪錛屽亣璁句綘鎯蟲妸涓涓猧nt杞崲鎴恉ouble錛屼互渚胯鍖呭惈int綾誨瀷鍙橀噺鐨勮〃杈懼紡浜х敓鍑烘誕鐐規暟鍊肩殑緇撴灉銆傚鏋滅敤C椋庢牸鐨勭被鍨嬭漿鎹紝浣犺兘榪欐牱鍐欙細 int聽firstNumber,聽secondNumber; double聽result聽=聽((double)firstNumber)/secondNumber錛?br />濡傛灉鐢ㄤ笂榪版柊鐨勭被鍨嬭漿鎹㈡柟娉曪紝浣犲簲璇ヨ繖鏍峰啓錛?br />double聽result聽=聽static_cast
<
double
>
(firstNumber)/secondNumber; 榪欐牱鐨勭被鍨嬭漿鎹笉璁烘槸瀵逛漢宸ヨ繕鏄紼嬪簭閮藉緢瀹規槗璇嗗埆銆?br />static_cast聽
鍦ㄥ姛鑳戒笂鍩烘湰涓婁笌C椋庢牸鐨勭被鍨嬭漿鎹竴鏍峰己澶э紝鍚箟涔熶竴鏍楓傚畠涔熸湁鍔熻兘涓婇檺鍒躲備緥濡傦紝浣犱笉鑳界敤static_cast璞$敤C椋庢牸鐨勭被鍨嬭漿鎹竴鏍鋒妸
聽struct杞崲鎴恑nt綾誨瀷鎴栬呮妸double綾誨瀷杞崲鎴愭寚閽堢被鍨嬶紝鍙﹀錛宻tatic_cast涓嶈兘浠庤〃杈懼紡涓幓闄onst灞炴э紝鍥犱負
鍙︿竴涓柊鐨勭被鍨嬭漿鎹㈡搷浣滅const_cast鏈夎繖鏍風殑鍔熻兘銆?br />鍏跺畠鏂扮殑C++綾誨瀷杞崲鎿嶄綔絎﹁鐢ㄥ湪闇瑕佹洿澶氶檺鍒剁殑鍦版柟銆俢onst_cast鐢ㄤ簬
綾誨瀷杞崲鎺夎〃杈懼紡鐨刢onst鎴杤olatileness灞炴с傞氳繃浣跨敤const_cast錛屼綘鍚戜漢浠拰緙栬瘧鍣ㄥ己璋冧綘閫氳繃綾誨瀷杞崲鎯沖仛鐨勫彧鏄敼鍙樹竴浜涗笢
瑗跨殑聽constness鎴栬卾olatileness灞炴с傝繖涓惈涔夎緙栬瘧鍣ㄦ墍綰︽潫銆傚鏋滀綘璇曞浘浣跨敤const_cast鏉ュ畬鎴愪慨鏀?
constness聽鎴栬卾olatileness灞炴т箣澶栫殑浜嬫儏錛屼綘鐨勭被鍨嬭漿鎹㈠皢琚嫆緇濄備笅闈㈡槸涓浜涗緥瀛愶細 class聽Widget聽{聽 聽}; class聽SpecialWidget:聽public聽Widget聽{聽 聽}; void聽update(SpecialWidget聽*psw); SpecialWidget聽sw;聽//聽sw聽鏄竴涓潪const聽瀵硅薄銆?br />const聽SpecialWidget&聽csw聽=聽sw;聽//聽csw聽鏄痵w鐨勪竴涓紩鐢?br />//聽瀹冩槸涓涓猚onst聽瀵硅薄 update(
&csw
);聽//聽閿欒!涓嶈兘浼犻掍竴涓猚onst聽SpecialWidget*聽鍙橀噺 //聽緇欎竴涓鐞哠pecialWidget*綾誨瀷鍙橀噺鐨勫嚱鏁?br />update(const_cast
<
SpecialWidget
*
>
(
&csw
)); //聽姝g‘錛宑sw鐨刢onst琚樉紺哄湴杞崲鎺夛紙 //聽csw鍜宻w涓や釜鍙橀噺鍊煎湪update //鍑芥暟涓兘琚洿鏂幫級 update((SpecialWidget*)
&csw
); //聽鍚屼笂錛屼絾鐢ㄤ簡涓涓洿闅捐瘑鍒?br />//鐨凜椋庢牸鐨勭被鍨嬭漿鎹?br />Widget聽*pw聽=聽new聽SpecialWidget; update(pw);聽//聽閿欒錛乸w鐨勭被鍨嬫槸Widget*錛屼絾鏄?br />//聽update鍑芥暟澶勭悊鐨勬槸SpecialWidget*綾誨瀷 update(const_cast
<
SpecialWidget
*
>
(pw)); //聽閿欒錛乧onst_cast浠呰兘琚敤鍦ㄥ獎鍝?br />//聽constness聽or聽volatileness鐨勫湴鏂逛笂銆? //聽涓嶈兘鐢ㄥ湪鍚戠戶鎵垮瓙綾昏繘琛岀被鍨嬭漿鎹€?br />鍒扮洰鍓嶄負姝紝const_cast鏈鏅氱殑鐢ㄩ斿氨鏄漿鎹㈡帀瀵硅薄鐨刢onst灞炴с?br />絎?
浜岀鐗規畩鐨勭被鍨嬭漿鎹㈢鏄痙ynamic_cast錛屽畠琚敤浜庡畨鍏ㄥ湴娌跨潃綾葷殑緇ф壙鍏崇郴鍚戜笅榪涜綾誨瀷杞崲銆傝繖灝辨槸璇達紝浣犺兘鐢╠ynamic_cast鎶婃寚鍚戝熀
綾葷殑鎸囬拡鎴栧紩鐢ㄨ漿鎹㈡垚鎸囧悜鍏舵淳鐢熺被鎴栧叾鍏勫紵綾葷殑鎸囬拡鎴栧紩鐢紝鑰屼笖浣犺兘鐭ラ亾杞崲鏄惁鎴愬姛銆傚け璐ョ殑杞崲灝嗚繑鍥炵┖鎸囬拡錛堝綋瀵規寚閽堣繘琛岀被鍨嬭漿鎹㈡椂錛夋垨鑰呮姏鍑哄紓甯?
錛堝綋瀵瑰紩鐢ㄨ繘琛岀被鍨嬭漿鎹㈡椂錛夛細 Widget聽*pw; update(dynamic_cast
<
SpecialWidget
*
>
(pw)); //聽姝g‘錛屼紶閫掔粰update鍑芥暟涓涓寚閽?br />//聽鏄寚鍚戝彉閲忕被鍨嬩負SpecialWidget鐨刾w鐨勬寚閽?br />//聽濡傛灉pw紜疄鎸囧悜涓涓璞? //聽鍚﹀垯浼犻掕繃鍘葷殑灝嗕嬌絀烘寚閽堛?br />void聽updateViaRef(SpecialWidget&聽rsw); updateViaRef(dynamic_cast
<
SpecialWidget
&
>
(*pw)); //姝g‘銆備紶閫掔粰updateViaRef鍑芥暟 //聽SpecialWidget聽pw聽鎸囬拡錛屽鏋減w //聽紜疄鎸囧悜浜嗘煇涓璞?br />//聽鍚﹀垯灝嗘姏鍑哄紓甯?br />dynamic_casts鍦ㄥ府鍔╀綘嫻忚緇ф壙灞傛涓婃槸鏈夐檺鍒剁殑銆傚畠涓嶈兘琚敤浜庣己涔忚櫄鍑芥暟鐨勭被鍨嬩笂錛堝弬瑙佹潯嬈綧24錛夛紝涔熶笉鑳界敤瀹冩潵杞崲鎺塩onstness錛?br />int聽firstNumber,聽secondNumber; double聽result聽=聽dynamic_cast
<
double
>
(firstNumber)/secondNumber; //聽閿欒錛佹病鏈夌戶鎵垮叧緋?br />const聽SpecialWidget聽sw; update(dynamic_cast
<
SpecialWidget
*
>
(
&sw
)); //聽閿欒!聽dynamic_cast涓嶈兘杞崲 //聽鎺塩onst銆?br />濡備綘鎯沖湪娌℃湁緇ф壙鍏崇郴鐨勭被鍨嬩腑榪涜杞崲錛屼綘鍙兘鎯沖埌static_cast銆傚鏋滄槸涓轟簡鍘婚櫎const錛屼綘鎬誨緱鐢╟onst_cast銆?br />榪欏洓涓被鍨嬭漿鎹㈢涓殑鏈鍚庝竴涓槸reinterpret_cast銆備嬌鐢ㄨ繖涓搷浣滅鐨勭被鍨嬭漿鎹紝鍏剁殑杞崲緇撴灉鍑犱箮閮芥槸鎵ц鏈熷畾涔夛紙implementation-defined錛夈傚洜姝わ紝浣跨敤reinterpret_casts鐨勪唬鐮佸緢闅劇Щ妞嶃?br />reinterpret_casts鐨勬渶鏅氱殑鐢ㄩ斿氨鏄湪鍑芥暟鎸囬拡綾誨瀷涔嬮棿榪涜杞崲銆備緥濡傦紝鍋囪浣犳湁涓涓嚱鏁版寚閽堟暟緇勶細 typedef聽void聽(*FuncPtr)();聽//聽FuncPtr聽is聽涓涓寚鍚戝嚱鏁?br />//聽鐨勬寚閽堬紝璇ュ嚱鏁版病鏈夊弬鏁?br />//聽榪斿洖鍊肩被鍨嬩負void FuncPtr聽funcPtrArray[10];聽//聽funcPtrArray聽鏄竴涓兘瀹圭撼 //聽10涓狥uncPtrs鎸囬拡鐨勬暟緇?br />璁╂垜浠亣璁句綘甯屾湜錛堝洜涓烘煇浜涜帿鍚嶅叾濡欑殑鍘熷洜錛夋妸涓涓寚鍚戜笅闈㈠嚱鏁扮殑鎸囬拡瀛樺叆funcPtrArray鏁扮粍錛?br />int聽doSomething(); 浣犱笉鑳戒笉緇忚繃綾誨瀷杞崲鑰岀洿鎺ュ幓鍋氾紝鍥犱負doSomething鍑芥暟瀵逛簬funcPtrArray鏁扮粍鏉ヨ鏈変竴涓敊璇殑綾誨瀷銆傚湪FuncPtrArray鏁扮粍閲岀殑鍑芥暟榪斿洖鍊兼槸void綾誨瀷錛岃宒oSomething鍑芥暟榪斿洖鍊兼槸int綾誨瀷銆?br />funcPtrArray[0]聽=聽
&doSomething;
聽//聽閿欒錛佺被鍨嬩笉鍖歸厤 reinterpret_cast鍙互璁╀綘榪嬌緙栬瘧錕鉸?/span>
]]> 浠婂ぉ鍠滃緱涓ゆ湰涔?闇瑕佺殑璇風暀璦 http://www.shnenglu.com/ace/archive/2006/04/14/5514.htmlStone Jiang Stone Jiang Fri, 14 Apr 2006 02:14:00 GMT http://www.shnenglu.com/ace/archive/2006/04/14/5514.html http://www.shnenglu.com/ace/comments/5514.html http://www.shnenglu.com/ace/archive/2006/04/14/5514.html#Feedback 5 http://www.shnenglu.com/ace/comments/commentRss/5514.html http://www.shnenglu.com/ace/services/trackbacks/5514.html C++ Coding Standards: 101 Rules, Guidelines, and Best Practices By Herb聽Sutter , Andrei聽Alexandrescu 榪欐湰涔﹀緱鍒?005 Jolt澶у 2. The Art or Unix Programming 榪欐槸緇xx鍜寉yyy浠ユ潵鐨勬渶浼樼鐨刄nix璇葷墿. ]]>閫氳繃妯℃澘瀹炵幇"澶氭佹?,閬垮紑緇ф壙甯︽潵鐨勬ц兘寮閿涔嬭璁? http://www.shnenglu.com/ace/archive/2006/04/14/5506.htmlStone Jiang Stone Jiang Fri, 14 Apr 2006 01:29:00 GMT http://www.shnenglu.com/ace/archive/2006/04/14/5506.html http://www.shnenglu.com/ace/comments/5506.html http://www.shnenglu.com/ace/archive/2006/04/14/5506.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/5506.html http://www.shnenglu.com/ace/services/trackbacks/5506.html 澶氭佺敓鍏跺疄榪樺彲浠ラ氳繃綾葷殑鑱氬悎鎴栫粍鍚堢殑鏂瑰紡鏉ヨ揪鍒?wbr>,浠庤岃繕鍙互閬垮厤緇ф壙鎴栧緇ф壙,
浠g爜濡備笅 (鏈湪寮鍙戠幆澧冧腑璋冭瘯)
#include聽 < stdio.h > 聽 template聽 < class 聽T > 聽 class 聽A聽聽 {聽 public :聽 聽聽 void 聽print()聽 聽聽{聽 聽聽聽聽base_.b();聽 聽聽}聽聽聽 聽聽typename聽T聽base_; };聽 class 聽B聽 {聽 public :聽 聽聽 void 聽b()聽 聽聽{聽 聽聽聽聽printf( " 聽Class聽B---------------------\n " );聽 聽聽}聽聽聽 };聽 class 聽C聽 {聽 public :聽 聽聽 void 聽b()聽 聽聽{聽 聽聽聽聽printf( " 聽Class聽C---------------------\n " );聽 聽聽}聽聽聽 };聽 int 聽main( int ,聽 char * 聽[])聽 {聽 聽聽A < B > 聽c;聽 聽聽c.print();聽 聽聽A < C > 聽c2; 聽聽c2.print(); 聽聽 return 聽 0 ;聽聽聽 }聽
]]> 閫氳繃妯℃澘瀹炵幇"澶氭佹?,閬垮紑緇ф壙甯︽潵鐨勬ц兘寮閿涔嬭璁?/title> http://www.shnenglu.com/ace/archive/2006/04/13/5478.htmlStone Jiang Stone Jiang Thu, 13 Apr 2006 10:21:00 GMT http://www.shnenglu.com/ace/archive/2006/04/13/5478.html http://www.shnenglu.com/ace/comments/5478.html http://www.shnenglu.com/ace/archive/2006/04/13/5478.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/5478.html http://www.shnenglu.com/ace/services/trackbacks/5478.html 榪欓噷鏄紓澶氭佹э紓鐨勪竴縐嶅疄鐜版柟寮?/div>聽
#include聽 < stdio.h > 聽 template聽 < class 聽BASE > 聽 class 聽A聽:聽 public 聽BASE聽 {聽 public :聽 聽聽 void 聽print()聽 聽聽{聽 聽聽聽聽BASE::b();聽 聽聽}聽聽聽 };聽 class 聽B聽 {聽 public :聽 聽聽 void 聽b()聽 聽聽{聽 聽聽聽聽printf( " 聽Class聽B---------------------\n " );聽 聽聽}聽聽聽 };聽 class 聽C聽 {聽 public :聽 聽聽 void 聽b()聽 聽聽{聽 聽聽聽聽printf( " 聽Class聽C---------------------\n " );聽 聽聽}聽聽聽 };聽 int 聽main( int ,聽 char * 聽[])聽 {聽 聽聽A < B > 聽c;聽 聽聽c.print();聽 聽聽A < C > 聽c2; 聽聽c2.print(); 聽聽 return 聽 0 ;聽聽聽 }聽
灝界General Programming 涓嶰bject-Oriend Programming娌℃湁浠涔堜紭鍔d箣鍒?濡傚仛涔樻硶鍜屽仛鍔犳硶娌℃湁濂?wbr>鍧忎箣鍒嗕竴鏍鳳紟
浣嗚繖閲岋紝鎴戣繕鏄兂闂竴涓嬶紝榪欓噷鏈夋ā鏉挎湁浠涔堝叿浣撶殑濂藉錛?/div>
聽
涓庝箣絳夋晥鐨勬垜鍙互閫氳繃浠庡熀綾繪淳鐢熺殑鏂瑰紡錛屽疄鐜板悓鏍風殑鏁堟灉錛屼絾浼楁墍鍛ㄧ煡錛岀戶鎵夸即闅忕潃鏄痸irtual table鍜屾ц兘涓嬮檷錛庤繖閲岋紝鐢ㄨ繖縐嶆柟娉曟樉鐒跺彲浠ラ伩寮涓婅堪闂錛?/wbr>
聽
榪欏彧鏄垜鐨勮鐭ヨ兘鍔涳紝鍑轟簬鎶涚爾寮曠帀鐨勭洰鐨勶紝甯屾湜澶у鑳藉鍙戣〃鐐規剰瑙?wbr>錛庤繖榪樻湁浠涔堢泭澶勫憿錛?/wbr>
]]>
C++緙栫爜涓嶈鑼冨嚭鐜扮殑閿欒涓渚嬬殑瑙f瀽 http://www.shnenglu.com/ace/archive/2006/04/11/5292.htmlStone Jiang Stone Jiang Tue, 11 Apr 2006 07:29:00 GMT http://www.shnenglu.com/ace/archive/2006/04/11/5292.html http://www.shnenglu.com/ace/comments/5292.html http://www.shnenglu.com/ace/archive/2006/04/11/5292.html#Feedback 0 http://www.shnenglu.com/ace/comments/commentRss/5292.html http://www.shnenglu.com/ace/services/trackbacks/5292.html
鍦℉uihoo鐨凙CE璁哄潧涓紝鏈変竴緗戝弸闂埌涓轟粈涔圓CE_Time_Value鐨勭鏁板湪Debug鐗堟湰灝戜竴縐掞紝鑰?br />鍦≧elease鐗堟湰涓娾滄甯糕濄傜粡榪囧鍏朵唬鐮佺殑澶嶈浠ュ強瀵笰CE鐨勮窡韙紝鍙戠幇鍘熸潵鏄紪鐮佷笉瑙勮寖鐘?br />涓嬬殑涓涓緢涓ラ噸鐨勯敊璇犳垚鐨勩傛湰鏂囧氨璁ㄨ榪欎竴渚嬪瓙銆?br /> 浠ヤ笅寮曠敤 聽
聽1 聽/* 聽2 聽鎴戝啓浜嗕釜浠庡勾鏈堟棩鏃跺垎縐掓暟鍊煎緱鍒癆CE_Time_Value緇撴灉鐨勫嚱鏁? 聽3 聽*/ 聽4 聽long 聽s_get_ace_datetime(ACE_Time_Value聽 & 聽ace_datetime, 聽5 聽聽聽聽聽聽聽 int 聽year, 聽6 聽聽聽聽聽聽聽 int 聽month, 聽7 聽聽聽聽聽聽聽 int 聽day, 聽8 聽聽聽聽聽聽聽 int 聽hour, 聽9 聽聽聽聽聽聽聽 int 聽min, 10 聽聽聽聽聽聽聽 int 聽sec) 11 聽{ 12 聽聽聽聽聽 if (year < 1970 聽 || 聽year > 2038 聽 || 聽month < 1 聽 || 聽month > 12 聽 || 聽day < 1 聽 || 聽day > 31 聽 || 13 聽聽聽聽聽聽聽聽聽hour < 0 聽 || 聽hour > 23 聽 || 聽min < 0 聽 || 聽min > 59 聽 || 聽sec < 0 聽 || 聽sec > 59 ) 14 聽聽聽聽聽聽聽聽聽聽聽ACE_ERROR_RETURN((LM_ERROR, 15 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽ACE_TEXT( " %I(鏃ユ湡鏃墮棿鍙傛暟婧㈠嚭鍚堢悊鐨勪範鎯棩鏈熸椂闂磋寖鍥?970.1.2-2038.1.18)n " )), - 1 ); 16 聽聽聽聽聽timespec_t聽spec_t; 17 聽聽聽聽聽tm聽time_tm;聽 18 聽聽聽time_tm.tm_year = year - 1900 ; 19 聽聽聽time_tm.tm_mon = month - 1 ; 20 聽聽聽time_tm.tm_mday = day; 21 聽聽聽time_tm.tm_hour = hour; 22 聽聽聽time_tm.tm_min = min; 23 聽聽聽 #if 聽defined聽(ACE_NDEBUG) 24 聽聽聽聽聽time_tm.tm_sec = sec; 25 聽聽聽 #else 26 聽聽聽聽聽time_tm.tm_sec = sec + 1 ;聽 // 濂囨?褰撶敱鍚勯儴鍒嗘暟閲忔瀯閫燗CE_Time_Value鏃?debug緙栬瘧鏃?縐掔殑鏁伴噺鎬繪槸鑷姩鍑?,鍦ㄦ瑕佽ˉ涓? 27 聽聽聽 #endif 28 聽聽聽聽spec_t.tv_sec = mktime( & time_tm);聽 29 聽聽聽聽 if (spec_t.tv_sec < 0 ) 30 聽聽聽聽ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT( " %I(鏃ユ湡鏃墮棿杞寲閿欒,寰楀埌<0鐨則ime_t,鏃ユ湡鑼冨洿鏄?970.1.2-2038.1.18)n " )), - 1 ); 31 聽聽聽聽ace_datetime. set (spec_t); 32 聽聽聽聽 return 聽 0 ; 33 聽} 34 聽/* 35 聽鎴戝湪VC++7.1涓婂垎鍒紪璇戜簡Debug鐗堟湰鍜孯elease鐗堟湰,time_tm.tm_sec绔熺劧浼氭湁涓縐掔殑宸埆,鑾悕鍏跺鍦板獎鍝嶄簡鎴戠殑欏圭洰. 36 聽鍝綅楂樻墜鐭ラ亾涓轟粈涔? 37 聽鍙﹀ACE_Time_Value鐨勮寖鍥村お灝?ACE涓槸鍚︽湁澶ф棩鏈熸椂闂磋寖鍥寸殑鍏跺畠綾誨皝瑁? 38 聽*/
浠ヤ笅鏄垜鐨勫洖璐?
浣犺繖涓棶棰樿繕鐪熸湁瓚?鎴戣窡韙簡ACE鐩稿叧浠g爜鍚庢墠鍙戠幇,闂鍘熸潵鍑哄湪浣犲啓鐨勫嚱鏁頒腑,鐥呭洜鏄?浣跨敤鏈畬鍏ㄥ垵濮嬪寲鐨勭粨鏋勪綋鍙橀噺 timespec_t聽spec_t; 鍚庨潰鍔犱笂璇彞 memset(
&spec_t
,0,sizeof(timespec_t)); 鍗沖彲 灞閮ㄥ彉閲徛爏pec_t聽鍦╠ebug鏃?鍚勫瓧孌靛潎琚垵濮嬪寲涓?xCCCCCCCC,瀹冩槸涓涓礋鏁?br /> 鍦ㄤ笅闈㈢殑鎿嶄綔涓?鍙慨鏀逛簡tv_sec,鑰宼v_nsec聽浠嶄負涓涓礋鏁?br /> spec_t.tv_sec=mktime(
&time_tm
);聽 ACE_Time_Value::normalize()榛橀粯鍦頒負浣犱綔浜嗚鏍煎寲澶勭悊錛屽氨鏇夸綘鍑忓幓浜嗕竴縐掗挓銆?br />
鍘熶唬鐮佹洿涓ラ噸鐨勯敊璇湪浜庯細 鍘熶互涓?Release鐗堟湰鏄滄甯糕濈殑錛屽叾瀹炰笉鐒訛紝鑰屾槸Release闅愯棌浜嗘洿涓ラ噸鐨勯敊璇?br />涓ラ噸鏄洜涓哄畠琛ㄧ幇鍑洪敊璇殑鏃跺欏緢闅忔満錛屼竴鏃︿駭鍝佸彂甯冿紝寰堥毦鍙戠幇銆?br />
//
瀵硅薄(緇撴瀯浣?timespec鏈変袱涓叕鏈夊睘鎬?/span>
聽typedef聽
struct
聽timespec 聽聽聽聽聽
{ 聽聽聽聽聽聽聽time_t聽tv_sec;聽
//
聽Seconds
聽聽聽聽聽聽聽
long
聽tv_nsec;聽
//
聽Nanoseconds,聽鍗佷嚎鍒嗕箣涓縐?/span>
聽聽聽聽聽}
聽timespec_t; 聽聽聽聽聽
鍦ㄥ師浠g爜16琛?br />timespec_t spec_t; 鏋勯犱簡涓涓?timespec_t聽 涓存椂瀵硅薄spec_t鍚?debug鐗堟妸瀹冨悇瀛楁鍒濆鍖栦負 0xcccccccc,榪欎嬌寰楅棶棰樹竴涓嬪瓙寰椾簬鏇濆厜.鑰孯elease鐗堟湰, spec_t 涓轟竴涓殢鏈哄? 鏈緥紼嬩腑,涓嶅厑璁?spec_t鐨則v_nsec涓洪潪0鐨勪換浣曟暟,涓烘甯稿敖綆$湅涓婂幓娌℃湁闂,浣嗘槸榪欎釜瀵瑰簲鐨凙CE_Time_Value鐨勫間篃涓嶅彲闈?鍦ㄧ壒瀹氭儏鍐典笅鍙兘浜х敓閲嶅ぇ浜嬫晠.
C++緙栫爜瑙勮寖錛?br />鍒濆鍖栧璞℃椂瑕佸畬鍏ㄣ?/p>
澹版槑涓涓粨鏋勪綋鍚庯紝濡傛灉瑕佸鍏跺垵濮嬪寲錛屽緩璁厛鎶婂畠璁句負0涔嬪悗鍐嶄綔鍚庣畫鎿嶄綔錛屽吇鎴愯繖鏍蜂竴涓範鎯紝灝變笉浼氬嚭鐜拌繖鏍烽儊闂風殑浜嬩簡銆?br /> 鍘熻創鍑哄:http://www.huihoo.com/forum/viewthread.php?tid=11016 mooyee
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
欧美电影在线播放 |
亚洲高清视频在线 |
一本一道久久综合狠狠老精东影业
|
久久精品卡一 |
久久久久国产精品一区 |
在线观看欧美 |
亚洲人成免费 |
国产精品网站在线观看 |
久久精品噜噜噜成人av农村 |
免费日韩成人 |
亚洲在线一区 |
久久久久久久久久久久久久一区 |
亚洲国产欧美不卡在线观看 |
亚洲激情不卡 |
国产亚洲精品美女 |
欧美激情一区二区三区高清视频 |
欧美理论电影在线观看 |
欧美在线视频一区二区 |
久久这里有精品视频 |
一本色道久久综合精品竹菊 |
亚洲新中文字幕 |
亚洲第一二三四五区 |
99精品久久 |
伊伊综合在线 |
亚洲神马久久 |
亚洲日韩欧美视频 |
午夜精品久久久 |
亚洲国产欧洲综合997久久 |
在线亚洲自拍 |
在线免费观看欧美 |
在线播放不卡 |
亚洲一级在线 |
亚洲精选一区 |
久久精品国产综合 |
亚洲一区欧美二区 |
欧美成人激情视频 |
久久蜜桃香蕉精品一区二区三区 |
欧美精品一区二区三区视频 |
另类亚洲自拍 |
亚洲人成网在线播放 |
亚洲欧美国产制服动漫 |
99re视频这里只有精品 |
久久久精品国产免费观看同学
|
国产精品一区二区三区久久 |
欧美wwwwww |
久久人人爽人人 |
妖精视频成人观看www |
激情亚洲网站 |
亚洲一区二区在线播放 |
亚洲乱码国产乱码精品精可以看 |
久久aⅴ国产欧美74aaa |
欧美制服第一页 |
欧美性jizz18性欧美 |
91久久久国产精品 |
亚洲精品国产拍免费91在线 |
久久久久久亚洲综合影院红桃 |
欧美一区二区黄 |
国产精品久久久久影院色老大 |
亚洲福利国产精品 |
亚洲国产人成综合网站 |
久久天堂精品 |
欧美chengren |
亚洲第一精品影视 |
久久久青草青青国产亚洲免观 |
久久久久国产精品午夜一区 |
亚洲日本免费电影 |
亚洲另类春色国产 |
欧美精品导航 |
亚洲日韩视频 |
亚洲一区二区三区免费在线观看 |
欧美精品一区二区三区在线看午夜
|
亚洲精品在线看 |
欧美极品一区二区三区 |
日韩系列在线 |
亚洲欧美一级二级三级 |
国产日韩精品视频一区二区三区 |
亚洲自拍三区 |
久久一二三区 |
亚洲精品久久7777 |
欧美日韩亚洲视频 |
亚洲免费在线视频 |
久久蜜桃香蕉精品一区二区三区 |
影音先锋成人资源站 |
欧美经典一区二区 |
一区二区三区高清不卡 |
欧美伊人久久大香线蕉综合69 |
国产在线欧美日韩 |
嫩草影视亚洲 |
亚洲少妇最新在线视频 |
欧美午夜精品一区 |
亚洲欧美电影院 |
美女性感视频久久久 |
日韩视频精品在线 |
国产精品国产 |
久久综合久久美利坚合众国 |
亚洲人成在线播放 |
亚洲专区免费 |
亚洲国产精品久久人人爱蜜臀
|
国产欧美视频一区二区 |
久久综合给合久久狠狠色
|
欧美中文在线字幕 |
欧美网站大全在线观看 |
先锋影音网一区二区 |
国内精品久久久久久久影视蜜臀 |
久久成年人视频 |
亚洲精品乱码久久久久 |
午夜激情综合网 |
亚洲高清视频的网址 |
欧美性猛交视频 |
免费观看在线综合色 |
一本不卡影院 |
欧美不卡视频一区 |
欧美在线观看你懂的 |
亚洲精品中文字幕在线观看 |
国产欧美日韩在线观看 |
欧美久久精品午夜青青大伊人 |
欧美在线1区 |
中日韩男男gay无套 |
亚洲国产成人精品久久 |
久久久久久久久伊人 |
亚洲一区二区三区精品动漫 |
欧美一级淫片aaaaaaa视频 |
欧美激情精品久久久久久蜜臀 |
久久综合狠狠综合久久激情 |
99热这里只有精品8 |
影音先锋一区 |
国产亚洲精品一区二555 |
欧美午夜激情在线 |
欧美精品日韩综合在线 |
一区二区三区视频免费在线观看 |
精品二区久久 |
国产精品永久免费 |
欧美日韩一区二区免费在线观看 |
欧美91福利在线观看 |
久久精品成人 |
久久精品亚洲精品 |
久久激情久久 |
欧美在线视频免费观看 |
午夜亚洲伦理 |
午夜在线电影亚洲一区 |
亚洲欧美精品在线观看 |
亚洲午夜视频在线 |
亚洲午夜精品一区二区三区他趣 |
99国产精品视频免费观看 |
亚洲欧洲一级 |
日韩亚洲精品视频 |
亚洲视频狠狠 |
亚洲无限av看 |
亚洲欧美激情一区 |
午夜在线一区 |
久久精品视频导航 |
久久午夜激情 |
欧美福利精品 |
欧美视频日韩 |
国产精品jvid在线观看蜜臀 |
午夜精品免费在线 |
亚洲自拍高清 |
久久久91精品国产 |
久久亚洲国产成人 |
欧美精品成人91久久久久久久 |
欧美日韩成人 |
国产精品免费小视频 |
国产一区二区三区黄视频 |
国产自产精品 |
亚洲区在线播放 |
一区二区三区蜜桃网 |
校园春色综合网 |
裸体丰满少妇做受久久99精品 |
欧美激情精品久久久久久免费印度 |
亚洲高清一二三区 |
亚洲尤物在线视频观看 |
久久久伊人欧美 |
欧美日韩一区综合 |
亚洲综合三区 |
亚洲视频日本 |
香港久久久电影 |
老司机亚洲精品 |
亚洲精品色婷婷福利天堂 |
亚洲视频网站在线观看 |
久久久久久久一区 |
国产精品vip |
亚洲电影免费观看高清 |
亚洲免费在线看 |
欧美成人精品在线播放 |
亚洲色图制服丝袜 |
欧美gay视频激情 |
国产日韩欧美亚洲 |
99精品欧美一区二区三区
|
在线视频中文亚洲 |
久久精品国产99国产精品 |
欧美日韩国产色站一区二区三区 |
国产午夜精品全部视频在线播放
|
国内精品久久久久久久果冻传媒 |
亚洲毛片在线免费观看 |
久久婷婷蜜乳一本欲蜜臀 |
日韩亚洲欧美一区二区三区 |
久久综合狠狠综合久久激情 |
国产精品羞羞答答 |
一区二区三区精品久久久 |
麻豆国产精品一区二区三区
|