ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯ãC ++ããã°ã©ã ã§éåžžã«åºã䜿çšãããŠããŸãã ãã ããæ®å¿µãªãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«åºã¥ãããœãªã¥ãŒã·ã§ã³ãå®è£
ããå Žåãå€ãã®å Žåããã¹ãçºçããŸãã ãã®èšäºã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãæ£ããèšèšããæ¹æ³ã«ã€ããŠèª¬æããŠããŸãããããã€ãã®ãªãã·ã§ã³ãæ€èšãããŠããŸãã ã¹ããŒããã€ã³ã¿ãŒã®äœ¿çšã«ã€ããŠè©³ãã説æããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«åºã¥ãäŸå€ã¯ã©ã¹ãšã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ãã³ãã¬ãŒãã®å®è£
ã®äŸã瀺ããŸãã
ç®æ¬¡
ã¯ããã«
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯ãããŒã¿ãæããªãã¯ã©ã¹ã§ãããäž»ã«çŽç²ãªä»®æ³é¢æ°ã§æ§æãããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãå®è£
ãã€ã³ã¿ãŒãã§ã€ã¹ããå®å
šã«åé¢ã§ããŸããã¯ã©ã€ã¢ã³ãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã䜿çšããŸããå¥ã®å Žæã§ã¯ãçŽç²ã«ä»®æ³é¢æ°ãåå®çŸ©ããããã¡ã¯ããªé¢æ°ãå®çŸ©ãããæŽŸçã¯ã©ã¹ãäœæãããŸãã å®è£
ã®è©³çްã¯ã¯ã©ã€ã¢ã³ãããå®å
šã«é ãããŠããŸãã ãã®ããã«ããŠãéåžžã®ã¯ã©ã¹ã§ã¯äžå¯èœãªçã®ã«ãã»ã«åãå®è£
ãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«ã€ããŠã¯ãScott Meyers [Meyers2]ããèªãããšãã§ããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯ããããã³ã«ã¯ã©ã¹ãšãåŒã°ããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã䜿çšãããšããããžã§ã¯ãã®ããŸããŸãªéšåéã®äŸåé¢ä¿ã匱ããããšãã§ããããŒã éçºãç°¡çŽ åãããã³ã³ãã€ã«/ã¢ã»ã³ããªæéãççž®ãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã䜿çšãããšãå®è¡æã«ã¢ãžã¥ãŒã«ãéžæçã«ããŒããããšãã«ãæè»ã§åçãªãœãªã¥ãŒã·ã§ã³ãç°¡åã«å®è£
ã§ããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãã€ã³ã¿ãŒãã§ã€ã¹ïŒAPIïŒã©ã€ãã©ãªïŒSDKïŒãšããŠäœ¿çšãããšããã€ããªäºææ§ã®åé¡ã®è§£æ±ºãç°¡åã«ãªããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯éåžžã«åºã䜿çšãããŠãããã©ã€ãã©ãªïŒSDKïŒã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒAPIïŒããã©ã°ã€ã³ïŒãã©ã°ã€ã³ïŒãªã©ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã®ã«åœ¹ç«ã¡ãŸãã Gang of Four [GoF]ãã¿ãŒã³ã®å€ãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã䜿çšããŠèªç¶ã«å®è£
ãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«ã¯ãCOMã€ã³ã¿ãŒãã§ã€ã¹ãå«ãŸããŸãã ãã ããæ®å¿µãªãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«åºã¥ãããœãªã¥ãŒã·ã§ã³ãå®è£
ããå Žåãå€ãã®å Žåããã¹ãçºçããŸãã ãã®åé¡ãæç¢ºã«ããŠã¿ãŸãããã
1.ç¹å¥ãªã¡ã³ããŒé¢æ°ããªããžã§ã¯ãã®äœæãšåé€
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«æäŸããããœãªã¥ãŒã·ã§ã³ãå®å
šã«çè§£ããããã«ç¥ã£ãŠããå¿
èŠã®ããC ++æ©èœã®ããã€ãã«ã€ããŠç°¡åã«èª¬æããŸãã
1.1ã ç¹å¥ãªã¡ã³ããŒé¢æ°
ããã°ã©ããŒã次ã®ãªã¹ãïŒããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒä»£å
¥æŒç®åããã¹ãã©ã¯ã¿ïŒããã¯ã©ã¹ã®ã¡ã³ããŒé¢æ°ãå®çŸ©ããŠããªãå Žåã¯ãã³ã³ãã€ã©ãŒããããè¡ãããšãã§ããŸãã C ++ 11ã§ã¯ããã®ãªã¹ãã«ç§»åã³ã³ã¹ãã©ã¯ã¿ãŒãšç§»åå²ãåœãŠæŒç®åã远å ãããŸããã ãããã®ã¡ã³ããŒé¢æ°ã¯ãç¹å¥ãªã¡ã³ããŒé¢æ°ãšåŒã°ããŸãã ãããã¯äœ¿çšãããå Žåã«ã®ã¿çæãããåæ©èœã«åºæã®è¿œå ã®æ¡ä»¶ãæºããããŸãã ãã®äœ¿çšãå®å
šã«é ãããŠããå¯èœæ§ãããããšã«æ³šæããŠãã ããïŒããšãã°ãç¶æ¿ãå®è£
ããå ŽåïŒã å¿
èŠãªæ©èœãçæã§ããªãå Žåããšã©ãŒãçæãããŸãã ïŒåé
眮æäœãé€ãããããã¯ã³ããŒæäœã«çœ®ãæããããŸããïŒã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããã¡ã³ããŒé¢æ°ã¯ããããªãã¯ã§åã蟌ã¿å¯èœã§ãã
ç¹å¥ãªã¡ã³ããŒé¢æ°ã¯ç¶æ¿ãããŸãããæŽŸçã¯ã©ã¹ã§ç¹å¥ãªã¡ã³ããŒé¢æ°ãå¿
èŠãªå Žåãã³ã³ãã€ã©ã¯åžžã«ãããçæããããšããŸããããã°ã©ããŒãåºæ¬ã¯ã©ã¹ã§å®çŸ©ãã察å¿ããã¡ã³ããŒé¢æ°ã®ååšã¯ããã«åœ±é¿ããŸããã
ããã°ã©ããŒã¯ãç¹å¥ãªã¡ã³ããŒé¢æ°ã®çæãçŠæ¢ã§ããŸããC++ 11ã§ã¯ãC ++ 98ã§ã察å¿ããã¡ã³ããŒé¢æ°ãprivateãšããŠå®£èšããå®çŸ©ããªãå Žåã "=delete"
æ§æã䜿çšããå¿
èŠããããŸãã ã¯ã©ã¹ç¶æ¿ã§ã¯ãåºæ¬ã¯ã©ã¹ã§äœæãããç¹å¥ãªã¡ã³ããŒé¢æ°ã®çæã®çŠæ¢ã¯ããã¹ãŠã®æŽŸçã¯ã©ã¹ã«é©çšãããŸãã
ããã°ã©ããŒãã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããã¡ã³ããŒé¢æ°ã«æ
£ããŠããå ŽåãC ++ 11ã§ã¯ã宣èšãããããããã ãã§ãªãããããæç€ºçã«ç€ºãããšãã§ããŸãã ãããè¡ãã«ã¯ãå®£èšæã«"=default"
æ§æã䜿çšããå¿
èŠããããŸãããã³ãŒãã¯èªã¿ããããã¢ã¯ã»ã¹ã¬ãã«ã®å¶åŸ¡ã«é¢é£ããè¿œå æ©èœã衚瀺ãããŸãã
ç¹å¥ãªã¡ã³ããŒé¢æ°ã®è©³çްã¯[Meyers3]ã«ãããŸãã
1.2ã ãªããžã§ã¯ãã®äœæãšåé€-åºæ¬çãªè©³çް
new/delete
æŒç®åã䜿çšããŠãªããžã§ã¯ããäœæããã³åé€ããããšã¯ãäžè¬çãªããŒã€ã³ã¯ã³æäœã§ãã new
åŒã³åºããšãæåã«ãªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠãããŸãã éžæãæåãããšãã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒãäŸå€ãã¹ããŒãããšãå²ãåœãŠãããã¡ã¢ãªã¯è§£æŸãããŸãã delete
æŒç®åãåŒã³åºããããšããã¹ãŠãéã®é åºã§è¡ãããŸããæåã«ãã¹ãã©ã¯ã¿ãåŒã³åºãããæ¬¡ã«ã¡ã¢ãªãè§£æŸãããŸãã ãã¹ãã©ã¯ã¿ã¯äŸå€ãã¹ããŒããªãã§ãã ããã
new
æŒç®åã䜿çšããŠãªããžã§ã¯ãã®é
åãäœæããå Žåãã¡ã¢ãªã¯æåã«é
åå
šäœã«å²ãåœãŠãããŸãã éžæãæåãããšããŒãããå§ãŸãé
åã®åèŠçŽ ã«å¯ŸããŠããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒãäŸå€ãã¹ããŒããå Žåãé
åã®äœæããããã¹ãŠã®èŠçŽ ã«ã€ããŠãã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºãã®éã®é åºã§ãã¹ãã©ã¯ã¿ãåŒã³åºãããå²ãåœãŠãããã¡ã¢ãªãè§£æŸãããŸãã é
åãåé€ããã«ã¯ã delete[]
æŒç®åïŒé
åã®delete
æŒç®åãšåŒã°ããïŒãåŒã³åºãå¿
èŠããããŸããé
åã®ãã¹ãŠã®èŠçŽ ã«ã€ããŠãã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºããšéã®é åºã§ãã¹ãã©ã¯ã¿ãåŒã³åºãããå²ãåœãŠãããã¡ã¢ãªãè§£æŸãããŸãã
泚æïŒ åäžã®ãªããžã§ã¯ããŸãã¯é
åãåé€ããããã©ããã«å¿ããŠã delete
æŒç®åã®æ£ãã圢åŒãåŒã³åºãå¿
èŠããããŸãã ãã®ã«ãŒã«ã¯å³å®ããå¿
èŠããããŸããããããªããšãæªå®çŸ©ã®åäœãçºçããå¯èœæ§ããããŸããã€ãŸããã¡ã¢ãªãªãŒã¯ãã¯ã©ãã·ã¥ãªã©ãäœã§ãèµ·ãããŸãã 詳现ã«ã€ããŠã¯ã[Meyers2]ãåç
§ããŠãã ããã
æšæºã®ã¡ã¢ãªå²ãåœãŠé¢æ°ã¯ãèŠæ±ãæºããããšãstd::bad_alloc
ãã std::bad_alloc
åã®äŸå€ãã¹ããŒããŸãã
ä»»æã®åœ¢åŒã®delete
æŒç®åãNULLãã€ã³ã¿ãŒã«é©çšããŠãå®å
šã§ãã
äžèšã®èª¬æã§ã¯ã1ã€ã®èª¬æãå¿
èŠã§ãã ããããåçŽåïŒçµã¿èŸŒã¿åãCã¹ã¿ã€ã«æ§é äœïŒã®å Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã¯åŒã³åºãããããã¹ãã©ã¯ã¿ã¯ã©ã®ãããªå Žåã§ãäœãããŸããã ã»ã¯ã·ã§ã³1.6ãåç
§ããŠãã ããã
1.3ã ãã¹ãã©ã¯ã¿ã¢ã¯ã»ã¹ã¬ãã«
delete
æŒç®åãã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã«é©çšããããšãããã®ã¯ã©ã¹ã®ãã¹ãã©ã¯ã¿ã¯delete
å©çšå¯èœã§ãªããã°ãªããŸããã ïŒã»ã¯ã·ã§ã³1.6ã§èª¬æãããã®èŠåã«ã¯ããã€ãã®äŸå€ããããŸããïŒãããã£ãŠããã¹ãã©ã¯ã¿ãå®å
šãŸãã¯ã¯ããŒãºã«ããããšã«ãããããã°ã©ãã¯ãã¹ãã©ã¯ã¿ãå©çšã§ããªãå Žåã«delete
æŒç®åã®äœ¿çšãçŠæ¢ããŸãã ãã¹ãã©ã¯ã¿ãã¯ã©ã¹ã§å®çŸ©ãããŠããªãå Žåãã³ã³ãã€ã©ã¯ç¬èªã«ãããè¡ãããã®ãã¹ãã©ã¯ã¿ã¯éãããŸãïŒã»ã¯ã·ã§ã³1.1ãåç
§ïŒã
1.4ã 1ã€ã®ã¢ãžã¥ãŒã«ã§äœæãšåé€
new
ãªãã¬ãŒã¿ãŒããªããžã§ã¯ããäœæããå Žåããããdelete
ãªãã¬ãŒã¿ãŒã®åŒã³åºãã¯åãã¢ãžã¥ãŒã«å
ã«ãªããã°ãªããŸããã æ¯Figçã«èšãã°ããããªãããããåã£ãå Žæã«çœ®ããŠãã ãããã ãã®èŠåã¯ããç¥ãããŠããŸã;äŸãã°ã[Sutter / Alexandrescu]ãåç
§ããŠãã ããã ãã®èŠåã«éåãããšãã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã®æ©èœã®ãäžäžèŽããçºçããå¯èœæ§ããããååãšããŠãããã°ã©ã ãç°åžžçµäºããŸãã
1.5ã ããªã¢ãŒãã£ãã¯ãªåé€
delete
æŒç®åã䜿çšããŠã€ã³ã¹ã¿ã³ã¹ãåé€ãããã¯ã©ã¹ã®ããªã¢ãŒãã£ãã¯ãªéå±€ãèšèšããŠããå Žåãåºæ¬ã¯ã©ã¹ã«éããŠããä»®æ³ãã¹ãã©ã¯ã¿ãå¿
èŠã§ããããã«ããã delete
æŒç®åãåºæ¬ã¯ã©ã¹ãžã®ãã€ã³ã¿ã«é©çšããããšãã«ããªããžã§ã¯ãã®å®éã®ã¿ã€ãã®ãã¹ãã©ã¯ã¿ãåŒã³åºãããŸãã ãã®èŠåã«éåãããšãåºæ¬ã¯ã©ã¹ã®ãã¹ãã©ã¯ã¿ãŒã®åŒã³åºããçºçãããªãœãŒã¹ãªãŒã¯ãçºçããå¯èœæ§ããããŸãã
1.6ã ã¯ã©ã¹å®£èšãäžå®å
šãªå Žåã®åé€
delete
æŒç®åã®éå€ãã¯ãç¹å®ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸã; void*
åã®ãã€ã³ã¿ãŒãŸãã¯äžå®å
šãªïŒããªãšã³ããã£ãïŒå®£èšãæã€ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã«é©çšã§ããŸãã ãã®å Žåããšã©ãŒã¯çºçããããã¹ãã©ã¯ã¿ã®åŒã³åºãã ããã¹ããããããã¡ã¢ãªãè§£æŸãã颿°ã®ã¿ãåŒã³åºãããŸãã äŸãèããŠã¿ãŸãããïŒ
class X;
ãã®ã³ãŒãã¯ãå®å
šãªX
ã¯ã©ã¹å®£èšãdelete
ãã€ã€ã«ãã¢ã§å©çšã§ããªãå Žåã§ãã³ã³ãã€ã«ãããŸãã ãã ããã³ã³ãã€ã«æã«ïŒVisual StudioïŒãèŠåãçºè¡ãããŸãã
warning C4150: deletion of pointer to incomplete type 'X'; no destructor called
X
ããã³CreateX()
å®è£
ãããå Žåãã³ãŒãã¯CreateX()
ãŸãCreateX()
ãnew
æŒç®åã«ãã£ãŠäœæããããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãè¿ãå Žåã Foo()
åŒã³åºãFoo()
æ£åžžã«å®è¡ããããã¹ãã©ã¯ã¿ã¯åŒã³åºãããŸããã ããããªãœãŒã¹ã®æµåºã«ã€ãªããå¯èœæ§ãããããšã¯æããã§ãããããèŠåã«æ³šæããå¿
èŠãããããšãæ¹ããŠèª¬æããŸãã
ãã®ãããªç¶æ³ã¯æ±ºããŠå€§ãããªãã®ã§ã¯ãªããã¹ããŒããã€ã³ã¿ãŒãèšè¿°åã¯ã©ã¹ãªã©ã®ã¯ã©ã¹ã䜿çšãããšç°¡åã«çºçããŸãã Scott Meyersã¯[Meyers3]ã§ãã®åé¡ãæ±ã£ãŠããŸãã
2.çŽç²ã«ä»®æ³çãªé¢æ°ãšæœè±¡ã¯ã©ã¹
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®æŠå¿µã¯ãçŽç²ãªä»®æ³é¢æ°ãæœè±¡ã¯ã©ã¹ãªã©ã®C ++ã®æŠå¿µã«åºã¥ããŠããŸãã
2.1ã çŽç²ãªä»®æ³æ©èœ
"=0"
æ§é ã䜿çšããŠå®£èšãããä»®æ³é¢æ°ã¯ãçŽç²ä»®æ³ãšåŒã°ããŸãã
class X {
éåžžã®ä»®æ³é¢æ°ãšã¯ç°ãªããçŽç²ãªä»®æ³é¢æ°ã¯å®çŸ©ã§ããŸããïŒãã¹ãã©ã¯ã¿ãé€ããã»ã¯ã·ã§ã³2.3ãåç
§ïŒããæŽŸçã¯ã©ã¹ã®1ã€ã§åå®çŸ©ããå¿
èŠããããŸãã
çŽç²ã«ä»®æ³é¢æ°ãå®çŸ©ã§ããŸãã ãšã³ãã¬ã ãµãã¿ãŒã¯ããã®æ©èœã®ããã€ãã®äŸ¿å©ãªäœ¿çšæ³ãæäŸããŸã[ã·ã£ãã¿ãŒ]ã
2.2ã æœè±¡ã¯ã©ã¹
æœè±¡ã¯ã©ã¹ã¯ãå°ãªããšã1ã€ã®çŽç²ãªä»®æ³é¢æ°ãæã€ã¯ã©ã¹ã§ãã æœè±¡ã¯ã©ã¹ããæŽŸçããå°ãªããšã1ã€ã®çŽç²ä»®æ³é¢æ°ããªãŒããŒã©ã€ãããªãã¯ã©ã¹ãæœè±¡ã«ãªããŸãã C ++æšæºã§ã¯ãæœè±¡ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®äœæã¯çŠæ¢ãããŠãããéæœè±¡ã¯ã©ã¹ã®æŽŸçç©ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãäœæã§ããŸãã ãããã£ãŠãæœè±¡ã¯ã©ã¹ãäœæãããåºæ¬ã¯ã©ã¹ãšããŠäœ¿çšãããŸãã ãããã£ãŠãã³ã³ã¹ãã©ã¯ã¿ãŒãæœè±¡ã¯ã©ã¹ã§å®çŸ©ãããŠããå Žåãã³ã³ã¹ãã©ã¯ã¿ãŒãéãããšã¯æå³ããããŸãããä¿è·ããå¿
èŠããããŸãã
2.3ã çŽç²ãªä»®æ³ãã¹ãã©ã¯ã¿
å Žåã«ãã£ãŠã¯ãçŽç²ãªä»®æ³ãã¹ãã©ã¯ã¿ãäœæããããšããå§ãããŸãã ãã ãããã®ãœãªã¥ãŒã·ã§ã³ã«ã¯2ã€ã®æ©èœããããŸãã
- çŽç²ã«ä»®æ³çãªãã¹ãã©ã¯ã¿ãå®çŸ©ããå¿
èŠããããŸãã ïŒéåžžãããã©ã«ãã®å®çŸ©ã䜿çšãããŸããã€ãŸãã
"=default"
æ§é ã䜿çšã"=default"
ãïŒæŽŸçã¯ã©ã¹ãã¹ãã©ã¯ã¿ã¯ãç¶æ¿ãã§ãŒã³å
šäœã«æ²¿ã£ãŠåºæ¬ã¯ã©ã¹ãã¹ãã©ã¯ã¿ãåŒã³åºããŸãããããã£ãŠããã¥ãŒã¯ã«ãŒãïŒçŽç²ã«ä»®æ³ãã¹ãã©ã¯ã¿ïŒã«å°éããããšãä¿èšŒãããŸãã - ããã°ã©ããæŽŸçã¯ã©ã¹ã§çŽç²ãªä»®æ³ãã¹ãã©ã¯ã¿ãåå®çŸ©ããŠããªãå Žåãã³ã³ãã€ã©ã¯ããã圌ã®ããã«è¡ããŸãïŒã»ã¯ã·ã§ã³1.1ãåç
§ïŒã ãããã£ãŠãçŽç²ã«ä»®æ³çãªãã¹ãã©ã¯ã¿ãæã€æœè±¡ã¯ã©ã¹ããæŽŸçããã¯ã©ã¹ã¯ããã¹ãã©ã¯ã¿ãæç€ºçã«åå®çŸ©ããªããŠãæœè±¡æ§ã倱ãå¯èœæ§ããããŸãã
çŽç²ãªä»®æ³ãã¹ãã©ã¯ã¿ã®äœ¿çšäŸã¯ãã»ã¯ã·ã§ã³4.4ã«ãããŸãã
3.ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯ãããŒã¿ãæããªãæœè±¡ã¯ã©ã¹ã§ãããäž»ã«çŽç²ãªä»®æ³é¢æ°ã§æ§æãããŠããŸãã ãã®ãããªã¯ã©ã¹ã¯ããã¹ãã©ã¯ã¿ãªã©ã®éåžžã®ä»®æ³é¢æ°ïŒçŽç²ã«ä»®æ³ã§ã¯ãªãïŒãæã€ããšãã§ããŸãã ãã¡ã¯ããªãŒé¢æ°ãªã©ã®éçã¡ã³ããŒé¢æ°ããããŸãã
3.1ã å®è£
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®å®è£
ã¯ãçŽç²ã«ä»®æ³é¢æ°ãåå®çŸ©ãããæŽŸçã¯ã©ã¹ã«ãªããŸãã åãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®å®è£
ã¯è€æ°ååšããå¯èœæ§ãããã2ã€ã®ã¹ããŒã ãå¯èœã§ããè€æ°ã®ç°ãªãã¯ã©ã¹ãåãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãç¶æ¿ããå Žåã¯æ°Žå¹³ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãããªã¢ãŒãã£ãã¯éå±€ã®ã«ãŒãã§ããå Žåã¯åçŽã§ãã ãã¡ããããã€ããªããããããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®æŠå¿µã®ããŒãã€ã³ãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå®å
šã«åé¢ããããšã§ããã¯ã©ã€ã¢ã³ãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã§ã®ã¿åäœããå®è£
ã¯å©çšã§ããŸããã
3.2ã ãªããžã§ã¯ãäœæ
å®è£
ã¯ã©ã¹ã«ã¢ã¯ã»ã¹ã§ããªããšããªããžã§ã¯ãã®äœææã«ç¹å®ã®åé¡ãçºçããŸãã ã¯ã©ã€ã¢ã³ãã¯ãå®è£
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã«äœ¿çšããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒãååŸããå¿
èŠããããŸãã å®è£
ã¯ã©ã¹ã䜿çšã§ããªããããã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšã§ããªããããå®è£
åŽã§å®çŸ©ãããŠãããã¡ã¯ããªãŒé¢æ°ã䜿çšãããŸãã ãã®é¢æ°ã¯éåžžã new
æŒç®åã䜿çšããŠãªããžã§ã¯ããäœæããäœæããããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãè¿ããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã«ãã£ã¹ãããŸãã ãã¡ã¯ããªãŒé¢æ°ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®éçã¡ã³ããŒã«ããããšãã§ããŸãããããã¯å¿
ãããå¿
èŠã§ã¯ãããŸãããããšãã°ãç¹å¥ãªãã¡ã¯ããªãŒã¯ã©ã¹ïŒããèªäœãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«ãªãããšããããŸãïŒãŸãã¯ããªãŒé¢æ°ã®ã¡ã³ããŒã«ããããšãã§ããŸãã ãã¡ã¯ããªé¢æ°ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®çã®ãã€ã³ã¿ã§ã¯ãªããã€ã³ããªãžã§ã³ããªãã€ã³ã¿ãè¿ãããšãã§ããŸãã ãã®ãªãã·ã§ã³ã«ã€ããŠã¯ãã»ã¯ã·ã§ã³3.3.4ããã³4.3.2ã§èª¬æããŸãã
3.3ã ãªããžã§ã¯ããåé€
ãªããžã§ã¯ãã®åé€ã¯éåžžã«éèŠãªæäœã§ãã ãšã©ãŒãçºçãããšãã¡ã¢ãªãªãŒã¯ãŸãã¯äºéåé€ãçºçããéåžžã¯ããã°ã©ã ãã¯ã©ãã·ã¥ããŸãã 以äžã§ã¯ããã®åé¡ãå¯èœãªéãè©³çŽ°ã«æ€èšãã誀ã£ã顧客è¡åã®é²æ¢ã«å€ãã®æ³šæãæã£ãŠããŸãã
4ã€ã®äž»ãªãªãã·ã§ã³ããããŸãã
delete
æŒç®åã䜿çšããŸãã- ç¹å¥ãªä»®æ³é¢æ°ã䜿çšããŸãã
- å€éšé¢æ°ã䜿çšããŸãã
- ã¹ããŒããã€ã³ã¿ãŒã䜿çšããèªååé€ã
3.3.1ã delete
æŒç®åã䜿çšdelete
ãããè¡ãã«ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«éããŠããä»®æ³ãã¹ãã©ã¯ã¿ãå¿
èŠã§ãã ãã®å Žåãã¯ã©ã€ã¢ã³ãåŽã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãåŒã³åºãdelete
æŒç®åã¯ãå®è£
ã¯ã©ã¹ã®ãã¹ãã©ã¯ã¿ãžã®åŒã³åºããæäŸããŸãã ãã®ãªãã·ã§ã³ã¯æ©èœããå ŽåããããŸãããæåãããšèªèããã®ã¯å°é£ã§ãã new
åŒã³åºããååŸãããéå£ãã®ç°ãªãåŽã§æŒç®åãdelete
ããŸããå®è£
åŽã§new
ãã¯ã©ã€ã¢ã³ãåŽã§delete
ããŸãã ãŸããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®å®è£
ãå¥ã®ã¢ãžã¥ãŒã«ã§è¡ãããå ŽåïŒããã¯éåžžã«äžè¬çãªããšã§ãïŒãã»ã¯ã·ã§ã³1.4ã®ã«ãŒã«éåãçºçããŸãã
3.3.2ã ç¹å¥ãªä»®æ³é¢æ°ã䜿çšãã
å¥ã®ãªãã·ã§ã³ãšããŠããã鲿©çãªæ¹æ³ããããŸããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«ã¯ããªããžã§ã¯ããåé€ããç¹å¥ãªä»®æ³é¢æ°ãå¿
èŠã§ãã ãã®ãããªé¢æ°ã¯ãæçµçã«delete this
ãåŒã³åºãããšã«ãªããŸãããããã¯æ¢ã«å®è£
åŽã§è¡ãããŠããŸãã ãã®ãããªé¢æ°ã¯ãããšãã°Delete()
ãªã©ã®ããŸããŸãªæ¹æ³ã§åŒã³åºãããšãã§ããŸãããä»ã®ãªãã·ã§ã³ã䜿çšãããŸãïŒ Release()
ã Destroy()
ã Dispose()
ã Free()
ã Close()
ãªã©ã ã»ã¯ã·ã§ã³1.4ã®èŠåã«åŸãããšã«å ããŠããã®ãªãã·ã§ã³ã«ã¯ããã€ãã®è¿œå ã®å©ç¹ããããŸãã
- å®è£
ã¯ã©ã¹ã«ãŠãŒã¶ãŒå®çŸ©ã®ã¡ã¢ãªå²ãåœãŠ/å²ãåœãŠè§£é€é¢æ°ã䜿çšã§ããŸãã
- ããšãã°ãåç
§ã«ãŠã³ã¿ãŒã䜿çšããŠãå®è£
ãªããžã§ã¯ãã®æå¹æéãå¶åŸ¡ããããã®ããè€éãªã¹ããŒã ãå®è£
ã§ããŸãã
ãã®å®æœåœ¢æ
ã§ã¯ã delete
æŒç®åã䜿çšããŠãªããžã§ã¯ããåé€ããããšãã詊ã¿ã¯ã³ã³ãã€ã«ãããå®è¡ãããããšãããããããã¯ãšã©ãŒã§ããã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã§ãããé²ãã«ã¯ã空ãŸãã¯çŽç²ã«ä»®æ³çã«ä¿è·ããããã¹ãã©ã¯ã¿ãããã°ååã§ãïŒã»ã¯ã·ã§ã³1.3ãåç
§ïŒã delete
æŒç®åã®äœ¿çšã¯éåžžã«ãã¹ã¯ã§ããããšã«æ³šæããŠãã ãããããšãã°ãæšæºã®ã¹ããŒããã€ã³ã¿ãŒã¯delete
æŒç®åã䜿çšããŠããã©ã«ãã§ãªããžã§ã¯ããåé€ãã察å¿ããã³ãŒãã¯å®è£
ã«æ·±ãåãããŠããŸãã ä¿è·ããããã¹ãã©ã¯ã¿ã䜿çšãããšãã³ã³ãã€ã«æ®µéã§ãã®ãããªãã¹ãŠã®è©Šè¡ãæ€åºã§ããŸãã
3.3.3ã å€éšé¢æ°ã䜿çšãã
ãã®ãªãã·ã§ã³ã¯ããªããžã§ã¯ããäœæããã³åé€ããæé ã®ç¹å®ã®å¯Ÿç§°æ§ãåŒãä»ããå¯èœæ§ããããŸãããå®éã«ã¯ä»¥åã®ããŒãžã§ã³ãããå©ç¹ã¯ãããŸããããå€ãã®è¿œå ã®åé¡ããããŸãã ãã®ãªãã·ã§ã³ã®äœ¿çšã¯æšå¥šãããŠãããããã以äžèæ
®ããããšã¯ãããŸããã
3.3.4ã ã¹ããŒããã€ã³ã¿ãŒã䜿çšããèªååé€
ãã®å Žåããã¡ã¯ããªé¢æ°ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®çã®ãã€ã³ã¿ã§ã¯ãªãã察å¿ããã¹ããŒããã€ã³ã¿ãè¿ããŸãã ãã®ã¹ããŒããã€ã³ã¿ãŒã¯å®è£
åŽã§äœæãããåé€ãªããžã§ã¯ããã«ãã»ã«åããŸããåé€ãªããžã§ã¯ãã¯ãã¹ããŒããã€ã³ã¿ãŒïŒãŸãã¯ãã®æåŸã®ã³ããŒïŒãã¯ã©ã€ã¢ã³ãåŽã§ç¯å²å€ã«ãªããšãå®è£
ãªããžã§ã¯ããèªåçã«åé€ããŸãã ãã®å Žåãå®è£
ãªããžã§ã¯ããåé€ããããã®ç¹å¥ãªä»®æ³é¢æ°ã¯å¿
èŠãªããããããŸããããä¿è·ããããã¹ãã©ã¯ã¿ãäŸç¶ãšããŠå¿
èŠã§ããã delete
æŒç®åã®èª€ã£ã䜿çšãé²ãå¿
èŠããããŸãã ïŒç¢ºãã«ããã®ãããªãšã©ãŒã®å¯èœæ§ã¯èããæžå°ããŠããããšã«æ³šæãã¹ãã§ããïŒãã®ãªãã·ã§ã³ã«ã€ããŠã¯ãã»ã¯ã·ã§ã³4.3.2ã§è©³ãã説æããŸãã
3.4ã å®è£
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ã©ã€ãã¿ã€ã ã管çãããã®ä»ã®ãªãã·ã§ã³
å Žåã«ãã£ãŠã¯ãã¯ã©ã€ã¢ã³ãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãåãåããŸããããããææããŸããã å®è£
ãªããžã§ã¯ãã®ã©ã€ãã¿ã€ã ã®ç®¡çã¯ãå®è£
åŽã§å®å
šã«è¡ãããŸãã ããšãã°ããªããžã§ã¯ãã¯éçãªã·ã³ã°ã«ãã³ãªããžã§ã¯ãã«ããããšãã§ããŸãïŒãã®ãœãªã¥ãŒã·ã§ã³ã¯å·¥å Žã§äžè¬çã§ãïŒã å¥ã®äŸã¯åæ¹åã®çžäºäœçšã«é¢é£ããŠããŸããã»ã¯ã·ã§ã³3.7ãåç
§ããŠãã ããã ã¯ã©ã€ã¢ã³ãã¯ãã®ãããªãªããžã§ã¯ããåé€ãã¹ãã§ã¯ãããŸãããããã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ã¯ã©ã¹ã®ä¿è·ããããã¹ãã©ã¯ã¿ãå¿
èŠã§ãã delete
æŒç®åã®èª€ã£ã䜿çšãé²ãå¿
èŠããããŸãã
3.5ã ã»ãã³ãã£ã¯ã¹ã®ã³ããŒ
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®å Žåãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠå®è£
ãªããžã§ã¯ãã®ã³ããŒãäœæããããšã¯ã§ããªããããã³ããŒãå¿
èŠãªå Žåãã¯ã©ã¹ã«ã¯å®è£
ãªããžã§ã¯ãã®ã³ããŒãäœæããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒãè¿ãä»®æ³é¢æ°ãå¿
èŠã§ãã ãã®ãããªé¢æ°ã¯ãã°ãã°ä»®æ³ã³ã³ã¹ãã©ã¯ã¿ãŒãšåŒã°ãããã®äŒçµ±çãªååã¯Clone()
ãŸãã¯Duplicate()
ã§ãã
ã³ããŒå²ãåœãŠæŒç®åã®äœ¿çšã¯çŠæ¢ãããŠããŸããããè¯ãã¢ã€ãã¢ãšã¯èŠãªãããŸããã ã³ããŒå²ãåœãŠæŒç®åã¯åžžã«ãã¢ã«ãªããŸã;ã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒãšãã¢ã«ããå¿
èŠããããŸãã ããã©ã«ãã®ã³ã³ãã€ã©ã«ãã£ãŠçæãããæŒç®åã¯ç¡æå³ã§ãããäœãããŸããã çè«çã«ã¯ãçŽç²ã«ä»®æ³ã®ä»£å
¥æŒç®åã宣èšãããã®åŸã«ãªãŒããŒã©ã€ãã§ããŸãããä»®æ³ä»£å
¥ã¯æšå¥šãããŸãã;詳现ã¯[Meyers1]ã«ãããŸãã ããã«ãå²ãåœãŠã¯éåžžã«äžèªç¶ã«èŠããŸããéåžžãå®è£
ã¯ã©ã¹ã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãä»ããŠè¡ããããããå²ãåœãŠã¯æ¬¡ã®ããã«ãªããŸãã
* = *;
å²ãåœãŠæŒç®åã¯æãçŠæ¢ãããŠãããå¿
èŠã«å¿ããŠããã®ãããªã»ãã³ãã£ã¯ã¹ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã«å¯Ÿå¿ããä»®æ³é¢æ°ãæã¡ãŸãã
å²ãåœãŠãçŠæ¢ããã«ã¯2ã€ã®æ¹æ³ããããŸãã
- å²ãåœãŠæŒç®åãåé€ããããšã宣èšããŸãïŒ
=delete
ïŒã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãéå±€ã圢æããå Žåãããã¯åºæ¬ã¯ã©ã¹ã§ååã§ãã ãã®ã¡ãœããã®æ¬ ç¹ã¯ãå®è£
ã¯ã©ã¹ã«åœ±é¿ããããšã§ããçŠæ¢ãé©çšãããŸãã - ããã©ã«ãã®å®çŸ©ïŒ
=default
ïŒã§ä¿è·ãããå²ãåœãŠã¹ããŒãã¡ã³ãã宣èšã=default
ã ããã¯å®è£
ã¯ã©ã¹ã«ã¯åœ±é¿ããŸããããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®éå±€ã®å Žåã¯ãåã¯ã©ã¹ã§ãã®ãããªã¢ããŠã³ã¹ãè¡ãå¿
èŠããããŸãã
3.6ã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒ
å€ãã®å Žåãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã¯å®£èšãããŠããŸããã ãã®å Žåãã³ã³ãã€ã©ãŒã¯ãç¶æ¿ã®å®è£
ã«å¿
èŠãªããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãçæããŸãïŒã»ã¯ã·ã§ã³1.1ãåç
§ïŒã ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯éããŠããŸãããå®å
šã§ååã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã§ãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒãå逿žã¿ïŒ =delete
ïŒãšããŠå®£èšãããŠããå Žåãã³ã³ãã€ã©ãŒã«ããã³ã³ã¹ãã©ã¯ã¿ãŒã®çæã¯ããã©ã«ãã§æå¶ãããŸãããã®ãããªã³ã³ã¹ãã©ã¯ã¿ãŒã¯æç€ºçã«å®£èšããå¿
èŠããããŸãã ããã©ã«ãã®å®çŸ©ïŒ =default
ïŒã§ä¿è·ããã®ãèªç¶=default
ã ååãšããŠããã®ãããªä¿è·ãããã³ã³ã¹ãã©ã¯ã¿ãŒã®å®£èšã¯åžžã«å®è¡ã§ããŸãã äŸã¯ã»ã¯ã·ã§ã³4.4ã«ãããŸãã
3.7ã åæ¹åã®çžäºäœçš
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã¯ãåæ¹åéä¿¡ã䜿çšããã®ã«äŸ¿å©ã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãä»ããŠã¢ãžã¥ãŒã«ã«ã¢ã¯ã»ã¹ã§ããå Žåãã¯ã©ã€ã¢ã³ãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®å®è£
ãäœæããã¢ãžã¥ãŒã«ã§ãããã«ãã€ã³ã¿ãŒãæž¡ãããšãã§ããŸãã ãããã®ãã€ã³ã¿ãŒãä»ããŠãã¢ãžã¥ãŒã«ã¯ã¯ã©ã€ã¢ã³ããããµãŒãã¹ãåä¿¡ããããŒã¿ãŸãã¯éç¥ãã¯ã©ã€ã¢ã³ãã«éä¿¡ããããšãã§ããŸãã
3.8ã ã¹ããŒããã€ã³ã¿ãŒ
å®è£
ã¯ã©ã¹ã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã¯éåžžããã€ã³ã¿ãŒãä»ããŠè¡ããããããã¹ããŒããã€ã³ã¿ãŒã䜿çšããŠãã®å¯¿åœãå¶åŸ¡ããã®ã¯èªç¶ãªããšã§ãã ãã ãããªããžã§ã¯ããåé€ããããã®2çªç®ã®ãªãã·ã§ã³ã䜿çšããå Žåã¯ãæšæºã®ã¹ããŒããã€ã³ã¿ãŒã䜿çšããŠããŠãŒã¶ãŒå逿©èœïŒã¿ã€ãïŒãŸãã¯ãã®ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã転éããå¿
èŠãããããšã«æ³šæããŠãã ããã ãããè¡ãããªãå Žåãã¹ããŒããã€ã³ã¿ãŒã¯delete
æŒç®åã䜿çšããŠãªããžã§ã¯ããåé€ããã³ãŒãã¯åçŽã«ã³ã³ãã€ã«ãããŸããïŒä¿è·ããããã¹ãã©ã¯ã¿ã®ãããïŒã æšæºã®ã¹ããŒããã€ã³ã¿ãŒïŒã«ã¹ã¿ã ãªã ãŒããŒã®äœ¿çšãå«ãïŒã¯ã[Josuttis]ã[Meyers3]ã§è©³çްã«èª¬æãããŠããŸãã ã«ã¹ã¿ã ãªã ãŒããŒã®äœ¿çšäŸã¯ãã»ã¯ã·ã§ã³4.3.1ã«ãããŸãã
, , , .
3.9. -
- const. , , -, .
3.10. COM-
COM- , , COM â , COM- , C, , . COM- C++ , COM.
3.11.
(API) (SDK). . -, -, . , (Windows DLL), : -. . , , . LoadLibrary()
, -, .
4.
4.1ã
, .
class IBase { protected: virtual ~IBase() = default;
.
class IActivatable : public IBase { protected: ~IActivatable() = default;
, , . , IBase
. , (. 1.3). , .
4.2.
class Activator : private IActivatable {
, , , - , .
4.3.
4.3.1.
. - ( IBase
):
struct BaseDeleter { void operator()(IBase* p) const { p->Delete(); } };
std::unique_ptr<>
- :
template <class I> // I â IBase using UniquePtr = std::unique_ptr<I, BaseDeleter>;
, , - , UniquePtr
.
-:
template <class I> // I â - CreateInstance() UniquePtr<I> CreateInstance() { return UniquePtr<I>(I::CreateInstance()); }
:
template <class I> // I â IBase UniquePtr<I> ToPtr(I* p) { return UniquePtr<I>(p); }
std::shared_ptr<>
std::unique_ptr<>
, , std::shared_ptr<>
. Activator
.
auto un1 = CreateInstance<IActivatable>(); un1->Activate(true); auto un2 = ToPtr(IActivatable::CreateInstance()); un2->Activate(true); std::shared_ptr<IActivatable> sh = CreateInstance<IActivatable>(); sh->Activate(true);
( â -):
std::shared_ptr<IActivatable> sh2(IActivatable::CreateInstance());
std::make_shared<>()
, ( ).
: , . : , - . 4.4.
4.3.2.
. -. std::shared_ptr<>
, , ( ). std::shared_ptr<>
( ) - , delete
. std::shared_ptr<>
- ( ) - . .
#include <memory> class IActivatable; using ActPtr = std::shared_ptr<IActivatable>; // class IActivatable { protected: virtual ~IActivatable() = default; // IActivatable& operator=(const IActivatable&) = default; // public: virtual void Activate(bool activate) = 0; static ActPtr CreateInstance(); // - }; // class Activator : public IActivatable { // ... public: Activator(); // ~Activator(); // void Activate(bool activate) override; }; Activator::Activator() {/* ... */} Activator::~Activator() {/* ... */} void Activator::Activate(bool activate) {/* ... */} ActPtr IActivatable::CreateInstance() { return ActPtr(new Activator()); }
- std::make_shared<>()
:
ActPtr IActivatable::CreateInstance() { return std::make_shared<Activator>(); }
std::unique_ptr<>
, , - , .
4.4.
C# Java C++ «», . . IBase
.
class IBase { protected: IBase() = default; virtual ~IBase() = 0;
, Delete()
, .
IBase::~IBase() = default; void IBase::Delete() { delete this; }
IBase
. Delete()
, . - IBase
. Delete()
, - . Delete()
, . , 4.3.1.
5. ,
5.1
, , , , .
, , IException
Exception
.
class IException { friend class Exception; virtual IException* Clone() const = 0; virtual void Delete() = 0; protected: virtual ~IException() = default; public: virtual const char* What() const = 0; virtual int Code() const = 0; IException& operator=(const IException&) = delete; }; class Exception { IException* const m_Ptr; public: Exception(const char* what, int code); Exception(const Exception& src) : m_Ptr(src.m_Ptr->Clone()) {} ~Exception() { m_Ptr->Delete(); } const IException* Ptr() const { return m_Ptr; } };
Exception
, IException
. , throw
, . Exception
, . - , .
Exception
, , .
IException
:
class ExcImpl : IException { friend class Exception; const std::string m_What; const int m_Code; ExcImpl(const char* what, int code); ExcImpl(const ExcImpl&) = default; IException* Clone() const override; void Delete() override; protected: ~ExcImpl() = default; public: const char* What() const override; int Code() const override; }; ExcImpl::ExcImpl(const char* what, int code) : m_What(what), m_Code(code) {} IException* ExcImpl::Clone() const { return new ExcImpl(*this); } void ExcImpl::Delete() { delete this; } const char* ExcImpl::What() const { return m_What.c_str(); } int ExcImpl::Code() const { return m_Code; }
Exception
:
Exception::Exception(const char* what, int code) : m_Ptr(new ExcImpl(what, code)) {}
, â .NET â , â , C++/CLI. , , , C++/CLI.
5.2
- :
template <typename T> class ICollect { protected: virtual ~ICollect() = default; public: virtual ICollect<T>* Clone() const = 0; virtual void Delete() = 0; virtual bool IsEmpty() const = 0; virtual int GetCount() const = 0; virtual T& GetItem(int ind) = 0; virtual const T& GetItem(int ind) const = 0; ICollect<T>& operator=(const ICollect<T>&) = delete; };
, -, .
template <typename T> class ICollect; template <typename T> class Iterator; template <typename T> class Contain { typedef ICollect<T> CollType; CollType* m_Coll; public: typedef T value_type; Contain(CollType* coll); ~Contain();
. , . , , , , - begin()
end()
, . (. [Josuttis]), for
. . , , .
6. -
. -, . . , ++. , .NET, Java Pyton. . , , . .NET Framework C++/CLI C++. .
7.
-, .
.
delete
.- .
- .
.
, delete
. , .
- , . , , delete
.
.
, , , , .
[GoF]
., ., ., . - . .: . è±èªãã â .: , 2001.
[Josuttis]
, . C++: , 2- .: . è±èªãã -MãïŒLLC "I.D. », 2014.
[Dewhurst]
, . C++. .: . è±èªãã â .: , 2012.
[Meyers1]
, . C++. 35 .: . è±èªãã â .: , 2000.
[Meyers2]
, . C++. 55 .: . è±èªãã â .: , 2014.
[Meyers3]
, . C++: 42 C++11 C++14.: . è±èªãã -MãïŒLLC "I.D. », 2016.
[Sutter]
, . C++.: . è±èªãã â : «.. », 2015.
[Sutter/Alexandrescu]
, . , . ++.: . è±èªãã -MãïŒLLC "I.D. », 2015.