锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
1. BaseService
BaseService.h
瑕佸疄鐜拌嚜宸辯殑鏈嶅姟綾誨彧闇浠嶣aseService緇ф壙騫朵笖Override鐩稿叧鐨剉irtual鍑芥暟鍗沖彲錛屼笅闈㈢ず鑼冧竴涓狟eepService綾伙紝璇ユ湇鍔″彧鏄畝鍗曞湴姣忛殧2縐抌eep涓涓嬶紝涓轟簡(jiǎn)綆鍗曟墍鏈変唬鐮佸潎鏀懼湪.h鏂囦歡涓細(xì)
BeepService.h
閫氬父鏉ヨ鍙』瑕丱verride涓婇潰鐨?涓獀irtual鍑芥暟灝監(jiān)K浜?jiǎn)锛?xì)
鍦?em>Run()涓繘琛屽疄闄呯殑宸ヤ綔錛?em>OnStop(),OnPause(),OnContinue()鍒欐槸涓轟簡(jiǎn)鍝嶅簲Service Control Manager鐨勬帶鍒躲?br>
test.cpp
鍋囪緙栬瘧鍚庣敓鎴愮殑exe鏂囦歡涓篵eep.exe錛屽垯鍦ㄥ懡浠よ涓彲浠ュ涓嬩嬌鐢細(xì)
(1). beep -i 瀹夎service(瀹夎浠ュ悗緋葷粺榪愯鏃朵細(xì)鑷姩鍚姩)
(2). beep -u 鍗歌澆service(濡傛灉service姝e湪榪愯錛屽垯鍏堝仠姝ervice鍐嶅嵏杞?
BaseServiced 鐨凱arseStandardArgs姝f槸鐢ㄦ潵瑙f瀽涓婅堪涓や釜鍛戒護(hù)銆?br>
2. ServiceCtrl
铏界劧Windows鑷甫鐨凷ervice Control Manager鍙互鎺у埗鏈嶅姟紼嬪簭錛屼絾鏄緢澶氭椂鍊欐垜浠兘闇瑕佺敤浠g爜鎺у埗錛岃繖灝辯敤鍒癝erviceCtrl綾伙紝璇ョ被鐨勬帴鍙e涓嬶細(xì)
ServiceCtrl.h
鎺ュ彛姣旇緝鐩磋娌′粈涔堝ソ璇寸殑錛岀湅涓嬮潰鐨勭ず渚嬩唬鐮侊細(xì)
test.cpp
7.Singleton鐨勬瀽鏋勯棶棰?/strong>
鍒版Singleton宸茬粡綆楁瘮杈冨畬鍠勪簡(jiǎn)錛屼絾鏄緷鐒剁畻涓嶄笂瀹岀編錛屽洜涓哄埌鐜板湪鍙槸瑙e喅浜?jiǎn)澶毦U跨▼闂錛屽姞鍏ヤ簡(jiǎn)妯℃澘鏀寔錛屽浜?span style="COLOR: #333399">KDL problem(The Dead Reference Problem)
瀹㈡埛浠g爜鐜板湪鍙互榪欐牱浣跨敤Singleton錛?/p>
The atexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to atexit create a register of functions that are executed in last-in, first-out (LIFO) order. The functions passed to atexit cannot take parameters. atexit use the heap to hold the register of functions. Thus, the number of functions that can be registered is limited only by heap memory.
閫氳繃灝哠ingleton鐨勬瀯閫犲嚱鏁拌涓簆rivate鍙互紱佹瀹㈡埛浠g爜鐩存帴鍒涘緩Singleton瀵硅薄錛岄櫎姝や箣澶栵紝Singleton鐨刢opy constructor鍜宑opy assignment operator閮戒負(fù)private涓斾粎鏈夊0鏄庢病鏈夊疄鐜幫紝紱佹浜?jiǎn)瀹㈡埛浠g爜鎷疯礉Singleton瀵硅薄銆傚敮涓鍙互鍒涘緩Singleton瀵硅薄鐨勬槸Singleton鑷繁鐨勯潤(rùn)鎬佹垚鍛樺嚱鏁癐nstance錛岃繖鏍峰氨鍦ㄧ紪璇戝櫒淇濊瘉浜?jiǎn)Singleton瀹炰緥鐨勫敮涓鎬с備笂闈㈣繖浜涙槸鍦–++涓疄鐜癝ingleton妯″紡鏈鍩烘湰鐨勮鐐廣?br>
Instance鏂規(guī)硶淇濊瘉鍙湁鍦ㄧ涓嬈¤皟鐢ㄦ椂鎵嶄細(xì)鐢熸垚Singleton瀵硅薄錛屼互鍚庣殑璋冪敤鍙槸綆鍗曡繑鍥炲敮涓鐨勫凡瀛樺湪鐨勫疄渚嬨侷nstance鏂規(guī)硶瀹為檯涓婂疄鐜扮殑鏄?span style="COLOR: #333399">鎳掓儼鍒濆鍖?lazy initialize)錛?/em>濡傛灉紼嬪簭涓牴鏈病鏈夌敤鍒癝ingleton瀵硅薄錛屼篃灝辨牴鏈笉浼?xì)漶旂敓Singleton鐨勫疄渚嬶紝榪欏湪Singleton瀵硅薄寰堝皯浣跨敤涓斿垱寤篠ingleton瀵硅薄寮閿姣旇緝澶х殑鎯呭喌涓嬬壒鍒湁鐢ㄣ?/p>
2 s.DoSomething();
榪橀渶瑕佽鏄庣殑鏄疭ingleton鐨勬瀽鏋勫嚱鏁幫紝鏋愭瀯鍑芥暟涔熶負(fù)private鍙互紱佹瀹㈡埛鍐欏嚭濡備笅浠g爜銆傚鏋滄煇涓鎴峰啓鍑轟簡(jiǎn)濡備笅浠g爜錛岄殢鍚庣殑瀵筍ingleton鐨勮闂氨浼?xì)瀵艰嚧湄?fù)瀹氫箟琛屼負(fù)錛屽洜涓篠ingleton瀵硅薄宸茬粡涓嶅瓨鍦ㄣ?br>
2 delete p;
2.寮曞叆smart pointer
涓婇潰鐨勫疄鐜扮畻鏄竴涓ソ鐨勫疄鐜板悧錛熷綋鐒朵笉鏄紝鎴栬榪炰竴涓紜殑瀹炵幇閮界畻涓嶄笂銆傚鏋滀綘鎯沖噾鍚堬紝褰撶劧娌¢棶棰橈紝涓婇潰鐨勪唬鐮佸ぇ澶氭暟鎯呭喌涓嬪彲浠ュ伐浣滅殑寰堝ソ銆備篃璁鎬綘宸茬粡娉ㄦ剰鍒頒簡(jiǎn)涓浜涢棶棰橈紝姣斿璇村湪涓婇潰鐨勪唬鐮佷腑鍙湁new娌℃湁delete銆傛槸鐨勶紝浣犺浼?xì)鍙戠敓memory leak瀵瑰惂錛屽叾瀹瀖emory leak閮戒笉鏄富瑕佺殑闂錛屾墍鏈夌殑鐜頒唬鎿嶄綔緋葷粺鍦ㄨ繘紼嬬粨鏉熺殑鏃跺欓兘浼?xì)瀵瑰唴瀛樺緢濂界殑杩涜鍥炴敹銆傛瘮memory leak鏇村煎緱璁╀漢鎷呭咖鐨勬槸resource leak錛屽鏋淪ingleton鍦ㄦ瀯閫犲嚱鏁頒腑璇鋒眰浜?jiǎn)鏌愪簺璧勬簮锛?xì)緗戠粶榪炴帴錛屾枃浠跺彞鏌勶紝鏁版嵁搴撹繛鎺ョ瓑銆傝繖浜涜祫婧愬皢寰椾笉鍒伴噴鏀俱?br>
鍞竴淇resource leak鐨勬柟娉曞氨鏄湪紼嬪簭緇撴潫鐨勬椂鍊檇elete _instance銆傚綋鐒朵簡(jiǎn)錛岀敤smart pointer鍐嶅ソ涓嶈繃錛屽湪榪欓噷鐢╝uto_ptr灝卞彲浠ユ弧瓚抽渶瑕佷簡(jiǎn)(濡傛灉浣犺繕?shù)笉鐭ラ亾smart_ptr鏄粈涔堬紝鑺辯偣鏃墮棿鐔熸?zhèn)塁++鏍囧噯搴撳惂)錛屼慨鏀瑰悗鐨勪唬鐮佸涓嬶細(xì)
2 class Singleton {
3 public :
4 static Singleton& Instance() { // Unique point of access
5 if (0 == _instance.get())
6 _instance.reset(new Singleton());
7 return * (_instance.get());
8 }
9 void DoSomething(){}
10 private :
11 Singleton(){} // Prevent clients from creating a new Singleton
12 ~Singleton(){} // Prevent clients from deleting a Singleton
13 Singleton(const Singleton&); // Prevent clients from copying a Singleton
14 Singleton& operator=(const Singleton& );
15 private :
16 friend auto_ptr<Singleton> ;
17 static auto_ptr<Singleton> _instance; // The one and only instance
18 };
19
20 // Implementation file Singleton.cpp
21 auto_ptr<Singleton> Singleton::_instance;
3.鐢╝texit鏇挎崲smart pointer
C++騫舵病鏈夎瀹氫笉鍚?span style="COLOR: #333399">緙栬瘧鍗曞厓(translation unit錛岀畝鍗曡灝辨槸涓涓彲緙栬瘧鐨刢pp鏂囦歡)涓璼tatic瀵硅薄鐨勫垵濮嬪寲欏哄簭銆傚鏋滀竴涓▼搴忎腑鏈夊涓猄ingleton瀵硅薄錛岄偅涔堣繖浜汼ingleton瀵硅薄鐨勬瀽鏋勯『搴忎篃灝嗘槸浠繪剰鐨勩傚緢鏄劇劧錛屽綋澶氫釜Singleton瀵硅薄鏈変緷璧栧叧緋繪椂錛宻mart pointer鏍規(guī)湰鏃犳硶淇濊瘉Singleton鐨勬瀽鏋勯『搴忋?br>
msdn涓atexit鎻忚堪濡備笅錛?/p>
闇瑕佽鏄庣殑鏄痑texit騫朵笉姣攕mart pointer濂藉灝戯紝LIFO鐨勪繚璇佸浜庢湁澶嶆潅渚濊禆鍏崇郴鐨勫涓猄ingleton渚濈劧鏉熸墜鏃犲姏錛屼絾鏄敤atexit鏇挎崲smart pointer鍗存槸蹇呴』鐨勶紝瀹冩槸璁捐瀹岀編Singleton鐨勫熀紜銆?br>
#濡傛灉浣犵枒鎯慳texit涓轟粈涔堣繕鏄笉琛岋紝璇瘋(gè)冭檻涓嬮潰鐨勬儏鍐碉細(xì)
NOTE錛氫笅闈㈢殑鎯呭喌鍦?em>Modern C++ Design
鏌愪釜紼嬪簭涓嬌鐢ㄤ簡(jiǎn)濡備笅3涓猄ingleton錛?span style="COLOR: #333399">Keyboard錛?span style="COLOR: #333399">Display錛?span style="COLOR: #333399">Log銆?span style="COLOR: #333399">Keyboard鍜?span style="COLOR: #333399">Display鍒嗗埆瀵瑰簲浜庤綆楁満鐨勯敭鐩樺拰鏄劇ず鍣紝Log鐢ㄦ潵璁板綍閿欒淇℃伅銆傚亣璁懼綋Keyboard鍜?span style="COLOR: #333399">Display鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鍑虹幇閿欒鏃朵細(xì)璋冪敤Log璁板綍閿欒淇℃伅錛屽茍涓旀瀯閫犲拰鏋愭瀯瀵艱嚧鐨勪換浣曢敊璇兘浼?xì)缁堟绋嬪簭銆?br>
鍦ㄧ▼搴忓惎鍔ㄦ椂錛屽鏋?span style="COLOR: #333399">Keyboard鏋勯犳垚鍔燂紝Display鏋勯犲け璐ワ紝寰堟樉鐒跺湪Display鐨勬瀯閫犲嚱鏁頒腑灝嗕細(xì)鏋勯?span style="COLOR: #333399">Log鑰屼笖澶辮觸淇℃伅浼?xì)琚?span style="COLOR: #333399">Log璁板綍錛屾牴鎹亣璁捐繖鏃跺欑▼搴忓噯澶囬鍑猴紝atexit娉ㄥ唽鐨勫嚱鏁板皢浼?xì)鎸塋IFO鐨勯『搴忚璋冪敤銆傚洜涓?span style="COLOR: #333399">Keyboard鍏堜簬Log鏋勯狅紝鎵浠?span style="COLOR: #333399">Log鍏堜簬Keyboard鏋愭瀯錛屼絾鏄綋鐢變簬鏌愮鍘熷洜Keyboard鍦ㄦ瀽鏋勬椂澶辮觸錛屾兂瑕佽皟鐢?span style="COLOR: #333399">Log璁板綍閿欒淇℃伅鏃訛紝Log鏃╁凡琚攢姣侊紝鍒橪og::Instance()灝嗕細(xì)瀵艱嚧鏈畾涔夎涓恒?br>
#atexit鐨勪弗閲嶉棶棰橈細(xì)
浠庝笂闈㈢殑渚嬪瓙鍙互鐪嬪嚭錛宎texit鍜宻mart pointer鐩告瘮浠呬粎鏄湁LIFO鐨勪繚璇佽屽凡錛岃繖鏍風(fēng)殑淇濊瘉璨屼技涔熶笉鎬庝箞鏈夋晥錛屽洜涓篴texit璺焥mart pointer涓鏍蜂篃鏃犳硶瑙e喅KDL probleam銆?br>
atexit鐢變簬LIFO甯︽潵浜?jiǎn)鍙﹀鐨勯棶棰樺Q岀湅涓嬮潰鐨勪唬鐮侊細(xì)
涓婇潰鐨勫皬孌典唬鐮佺敤atexit娉ㄥ唽浜?jiǎn)Foo錛孎oo璋冪敤浜?jiǎn)std::atexit(Bar)銆傚綋紼嬪簭閫鍑烘椂錛屾牴鎹產(chǎn)texit鐨凩IFO淇濊瘉錛孊ar鍦‵oo涔嬪悗娉ㄥ唽錛屽洜姝ar搴旇鍦‵oo涔嬪墠璋冪敤錛屼絾鏄綋Bar娉ㄥ唽鐨勬椂鍊橣oo宸茬粡璋冪敤浜?jiǎn)锛孊ar鏍規(guī)湰灝辨病鏈夋満浼?xì)鑳藉鍦‵oo涔嬪墠璋冪敤銆傝繖鏄庢樉鑷浉鐭涚浘瀵瑰惂錛屾病鍔炴硶錛孋++鏍囧噯濂藉儚蹇借浜?jiǎn)杩欎竴鐐癸紝鍥犳濡傛灉綾諱技浠g爜琚皟鐢紝鑲畾涓嶄細(xì)鏈変粈涔堝ソ鐨勭粨鏋滐紝濂戒竴鐐規(guī)槸resource leak錛屽樊涓鐐逛及璁$▼搴忓氨宕╂簝浜?jiǎn)锛佸Q侊紒
atexit鐨勮繖涓棶棰樿窡Singleton鏈夊叧緋誨悧錛熷綋鐒舵湁錛屽鏋滃湪涓涓猄ingleton鐨勬瀽鏋勫嚱鏁頒腑璋冪敤atexit灝變細(xì)鍑虹幇涓婅堪闂銆傚嵆鍦?span style="COLOR: #333399">KDL problem涓紝濡傛灉Keyboard鍜?span style="COLOR: #333399">Display閮芥瀯閫犳垚鍔燂紝褰?span style="COLOR: #333399">Keyboard鎴?span style="COLOR: #333399">Display浠繪剰涓涓瀽鏋勫け璐ユ椂錛?span style="COLOR: #333399">Keyboard鎴?span style="COLOR: #333399">Display鍦ㄦ瀽鏋勫嚱鏁頒腑浼?xì)鏋勯?span style="COLOR: #333399">Log錛?span style="COLOR: #333399">Log鐨勬瀯閫犲嚱鏁頒細(xì)闂存帴璋冪敤atexit銆俹ops!!!錛屽彲鎬曠殑鏈畾涔夎涓恒?br>
鐪嬪埌榪欓噷浣犱竴瀹氬atexit鐩稿綋澶辨湜錛岃矊浼煎畠甯︽潵鐨勫ソ澶勫浜庡潖澶勩備絾鏄浣犵浉淇★紝濡傛灉閫傚綋璁捐錛宎texit鍦ㄥ悗闈㈢殑Singleton鏀歸犱腑浼?xì)钃v鍒板緢閲嶈鐨勪綔鐢ㄣ?br>
鐢╝texit鍚庣殑浠g爜錛?/p>
鍍忎笂闈㈡湭鐗瑰寲鐨勬ā鏉塊氬父鍙仛base templates銆傚綋鐒?dòng)灱?em>base templates鑳藉琚壒鍖栵紝鍦ㄧ壒鍖栬繖涓鐐逛笂
class templates 鍜?em>function templates鏈夊緢澶х殑鍖哄埆錛氫竴涓?em>class template 鑳藉琚?em>partially specialized and/or
fully specialized錛屼竴涓?em>function template鍙兘琚?em>fully specialized錛屼絾鏄敱浜?em>function templates鑳藉閲嶈澆鎴戜滑鍙互閫氳繃閲嶈澆鏉ュ疄鐜板拰partially specialized 鐩稿綋鐨勫姛鑳姐備笅闈㈢殑浠g爜璇存槑浜?jiǎn)杩欎簺鍖哄埆锛?xì)
鏍規(guī)嵁鍑芥暟閲嶈澆瑙f瀽瑙勫垯錛?/p>
涓婇潰璇寸殑榪欎簺鍏跺疄閮芥槸寰堢畝鍗曠殑鎯呭喌錛屽ぇ澶氭暟浜哄緢瀹規(guī)槗灝辮兘鏄庣櫧錛屼笅闈㈢殑鎵嶆槸瀹規(guī)槗璁╀漢寮勬販鐨勶細(xì)
1.鑰冭檻濡備笅浠g爜錛?/p>
鏈鍚庝竴琛岀殑緇撴灉鍍忓ぇ澶氭暟浜烘墍鏈熸湜鐨勪竴鏍鳳紝闂鏄細(xì)涓轟粈涔堟湡鏈涙槸榪欎釜緇撴灉錛?br />濡傛灉浣犳湡鏈涚殑鍘熷洜鏄敊璇殑錛屾帴涓嬫潵鐨勪竴瀹氫細(xì)璁╀綘濂藉銆備篃璁鎬綘浼?xì)璇村Q?鎴戜負(fù)int*鍐欎簡(jiǎn)涓涓壒鍖栫増鏈紝f(p)褰撶劧浼?xì)璋冪?span style="COLOR: #3366ff">c"錛屼笉騫哥殑鏄紝榪欐鏄敊璇殑鍘熷洜!!!
2.鍐嶈冭檻涓嬮潰鐨勪唬鐮侊細(xì)
濡傛灉榪欎釜緇撴灉璁╀綘鎰熷埌鎯婂錛岄偅灝卞浜?jiǎn)锛佸緢澶氫汉閮戒細(xì)鎰熷埌鎯婂锛?br />鐞嗚В榪欎釜鐨勫叧閿槸錛?em style="COLOR: #993300">Specializations don't overload,only the base templates overload.
閲嶈澆瑙f瀽浠呬粎閫夋嫨base template(鎴栬卬ontemplate function錛屽鏋滄湁鐨勮瘽)錛屽彧鏈夊綋緙栬瘧鍣ㄥ凡緇忓喅瀹氫簡(jiǎn)鍝釜
base template灝嗕細(xì)琚夋嫨錛岀紪璇戝櫒鎵嶄細(xì)緇х畫寰涓嬪鎵鵑傚悎鐨勭壒鍖栫増鏈紝濡傛灉鎵懼埌浜?jiǎn)灏变娇鐢ㄩ偅涓壒鍖栫増鏈?br />
鏈鍚庯紝搴斿綋閬垮厤鐗瑰寲鍑芥暟妯℃澘錛屼篃瑕侀伩鍏嶉噸杞藉嚱鏁版ā鏉?nontemplate function鐨勯噸杞藉綋鐒舵病闂)銆傚鏋滀竴瀹氳榪欐牱錛屽彲浠ヤ嬌鐢ㄥ涓嬫柟娉曟ā鎷熷嚱鏁版ā鏉跨殑鍋忕壒鍖栵細(xì)
2.澹版槑涓涓被瀹炵幇Runnable鎺ュ彛騫跺疄鐜皉un鏂規(guī)硶錛?/p>