www.philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects
ã ãã
Objective-Cãããžã§ã¯ãã«C ++ãåã蟌ãæ¹æ³
æ¥ãã§ããå ŽåãããããŒãã¡ã€ã«ãç Žæããã«Objective-Cã¯ã©ã¹ã«C ++ãªããžã§ã¯ããåã蟌ãåé¡ã«çŽæ¥è¡ãããã®ã§ãçŽç²ãªObjective-Cããã€ã³ã¯ã«ãŒãã§ããããã«ãèšäºãPimplããããŒãŸã§ã¹ã¯ããŒã«ã§ããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãã95ïŒ ã®ã±ãŒã¹ã§äœ¿çšã§ããŸãã æ®ãã«ã¯ãåé¡ã®ããæ·±ãåæãšããã解決ããããã®è¿œå ã®æ¹æ³ãå«ãŸããŠããŸãã
Objective-CãšC ++ãæ··åšãããçç±
éåžžãiOãŸãã¯Macã§ã®ããã°ã©ãã³ã°ã«Objective-Cã䜿çšãããšããããžã§ã¯ãã«C ++ãæ¿å ¥ããå¿ èŠãããå Žåã«ããééããŸããã çŸåšã®ã¿ã¹ã¯ã«æé©ãªã©ã€ãã©ãªãC ++ã§èšè¿°ãããŠããå Žåãããã°ãC ++ã§åé¡ãããç°¡åã«è§£æ±ºã§ããå ŽåããããŸãã æãäžè¬çãªäŸã¯C ++ãã³ãã¬ãŒãã§ãããéè€ããæšæºã³ãŒããèšè¿°ããå¿ èŠããããŸããã ããã»ã©æçœã§ã¯ãããŸããããObjective-Cããªããžã§ã¯ãæåãããããšããããŸãã ããã¹ãŠã®äººããã¹ãŠã®ãªããžã§ã¯ãã§ãããããã®ç°ç«¯ã®ããã«èãããŸãããéèŠãªããŒã¿æ§é ã§ã¯ããªããžã§ã¯ãã®åããé¢åã§ãSysnæ§é ã匱ãããããšããããããŸãã C ++ã䜿çšããã®ãé©åã§ãã
ãŸããObjective-Cã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒãªã©ãããå Žåãã¡ã¢ãªç®¡çã®ç¹ã§ãéåžžã«ç©æ¥µçã§ãã STLïŒããã³ãã®æ°ããæ¡åŒµæ©èœshared_ptrïŒã䜿çšãããšããã®åé¡ãå¿ããããå°ãªããšãã³ã³ã¹ãã©ã¯ã¿ãŒ/ãã¹ãã©ã¯ã¿ã«éäžãããããªãªãŒã¹ãä¿æã§ã³ãŒããä¹±éã«ããªãããšãã§ããŸãã ãã¡ãããããã¯å¥œã¿ã®åé¡ã§ãããç¶æ³ã«ãã£ãŠç°ãªããŸãã èªåã¡ã¢ãªç®¡çã¯ãéèŠãªããŒã¿æ§é ãæã€ã³ãŒãããã¢ã«ãŽãªãºã çã«è€éãªã³ãŒãã«åœ¹ç«ã¡ãŸãã
Objective-CãšC ++ãæ··åšããããã1ã€ã®çç±ã¯ãC ++ãããžã§ã¯ãããObjective-Cé¢æ°ãåŒã³åºãå¿ èŠãããå Žåã®å察ã®ç¶æ³ã§ãã äžè¬çãªäŸã¯ãã²ãŒã ãŸãã¯ãšã³ãžã³ãAppleãã©ãããã©ãŒã ã«ç§»æ€ããããšã§ãã ãã®ãããªå Žåã以äžã§èª¬æããææ³ãé©çšããããšãã§ããŸãã
æåŸã«ãC ++ã䜿çšããŠããã©ãŒãã³ã¹ãæ¹åã§ããŸãã Objective-Cã¡ãã»ãŒãžã®æè»æ§ã¯ãææ°ã®ã©ã³ã¿ã€ã ã§äœ¿çšããããã£ãã·ã³ã°ãã¯ããã¯ãèæ ®ããŠããã»ãšãã©ã®C ++ä»®æ³é¢æ°ã®å®è£ ãšæ¯èŒããŠããããã®ã³ã¹ãã課ããŸãã Objective-Cãªããžã§ã¯ãã«ã¯ãåçã®é«ééä»®æ³C ++é¢æ°ããããŸããã æé©åã®ããã«ãããã¯éèŠãªèŠçŽ ãšãªããŸãã
å ±éã®åæ¯ã«ã€ãªããïŒC
ãããã®2ã€ã®ããã°ã©ãã³ã°èšèªã1ã€ã®ãããžã§ã¯ãã§äœ¿çšããæ¹æ³ã®1ã€ã¯ãããããå®å šã«åé¢ããçŽç²ãªCãä»ããŠçžäºäœçšã§ããããã«ããããšã§ãã C ++ã©ã€ãã©ãªã䜿çšããã³ãŒãã¯.cppãã¡ã€ã«ã«è»¢éãããã€ã³ã¿ãŒãã§ã€ã¹ã¯CããããŒãã¡ã€ã«ã§å®£èšãããC ++ããŒãã¯externâ Câé¢æ°ã䜿çšããŠãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã€ã³ã¿ãŒãã§ã€ã¹ã«ã¢ã¯ã»ã¹ããã³ãŒãCã¯çŽç²ãªObjective-CïŒ.mïŒã§ãã
ããã¯åçŽãªã±ãŒã¹ã§ã¯ããŸãæ©èœããŸãããã·ã§ã«ãäœæããå¿ èŠãããå¯èœæ§ãé«ããªããŸãã ãªãŒãã³Cã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠåçã«ããŒããããC ++ã©ã€ãã©ãªã®çµéšããã人ãªãããããããç¥ã£ãŠããŸãã
çŸåšãObjective-Cã®ã»ãŒãã¹ãŠãGCCãŸãã¯clangã䜿çšããŠã³ã³ãã€ã«ãããŠããŸãã ã©ã¡ãã®ã³ã³ãã€ã©ãŒãObjective-C ++ããµããŒãããŠããŸããã€ãŸããèšèªãæ··åãããã䟿å©ãªæ¹æ³ããããšããããšã§ãã
Objective-C ++ããã³ããããŒãã¡ã€ã«ã®åé¡
äžèŠãããšãObjective-C ++æ¹èšã®äœ¿çšã¯æãç°¡åãªã¢ãããŒãã®ããã«èŠããŸãã ããã¯ãC ++ãšObjective-Cã1ã€ã®ã³ã³ãã€ã©ã«ããŒãžããçµæã§ããããã®ä¿¡é Œæ§ã®é«ãå®è£ ã¯GCCãšclangã®äž¡æ¹ã«ãããŸãã Objective-CãšC ++ã®éããèãããšãGCCããã°ã©ããŒã¯éå±ãªä»äºãããŠããŸãã ãããã.mãã¡ã€ã«ã®ååã.mmã«å€æŽããŠC ++ãã¡ã€ã«ãšããŠå®£èšãå§ãããšããã«ãããã»ã©ç°¡åã§ã¯ãªãããšãããããŸãã
ããããŒãã¡ã€ã«ãšCããªããã»ããµã¯ãé·å¹ŽCãC ++ãObjective-Cããã°ã©ãã®æ©ã¿ã®çš®ã§ããããããã®èšèªãæ··åšããããšäºæ ã¯ããã«æªåããŸãã Objective-Cã¯ã©ã¹ã®STLã©ã€ãã©ãªã®ãããã³ã³ãããŒïŒèŸæžãé£æ³é åïŒã䜿çšãããšããŸãã ç§ã®ç¥ãéããAppleã®Foundationãã¬ãŒã ã¯ãŒã¯ã«ã¯ãããªãŒäžã«æ§é çã«æ§ç¯ããããœãŒãæžã¿ãããã¯å«ãŸããŠããŸããã ãããã£ãŠãã¯ã©ã¹ã«ã¡ã³ããŒå€æ°ãäœæããŸãã
#include <map> @interface MyClass : NSObject { @private std::map<int, id> lookupTable; } // ... @end
ãã ããstd :: map <intãid>ã¯ãC ++ããµããŒãããã³ã³ãã€ã©ãŒã«å¯ŸããŠã®ã¿æå³ããããïŒincludeã®åŸã®ã¿ã§ããããããã®ããããŒãã¡ã€ã«ã¯Objective-C ++ãã¡ã€ã«ããã®ã¿ã€ã³ããŒãïŒ#importïŒã§ããŸãã ãããŠããã®ã¯ã©ã¹ã䜿çšããã³ãŒãã¯ãã¹ãŠObjective-C ++ã«å€æããå¿ èŠããããŸãã ããã«ãã§ãŒã³ã«æ²¿ã£ãŠãæ®ãã®ããããŒãã¡ã€ã«ãå€æããå¿ èŠãããïŒ.mmïŒããããžã§ã¯ãå šäœã§å€æããå¿ èŠããããŸãã
å Žåã«ãã£ãŠã¯ããã§åé¡ãããŸããã ããã«ãããããããã©ã€ãã©ãªã1ãæã§äœ¿çšããããã ãã«ãããžã§ã¯ãå šäœãŸãã¯ãã®å€§éšåãå€æŽããã®ã¯ãé¢åã§åé·ã§ãã ããã«ãC ++ãç¥ã£ãŠããObjective-Cããã°ã©ããŒã®äžã§ãããžã§ã¯ãã§å¯äžã®ãŠãŒã¶ãŒã§ããå Žåãããã¯è¯ãèãã§ã¯ãããŸããã ããã«ãçŽç²ãªC ++ Cã³ã³ãã€ã©ã§ã³ãŒããã³ã³ãã€ã«ãããšãã«åé¡ãçºçããå¯èœæ§ããããŸãããããããŸã£ããåé¡ãªãå®è¡ãããããšã¯ã»ãšãã©ãããŸããã ããã«ãããã¯ä»ã®Objective-Cãããžã§ã¯ãã§ã³ãŒããèªåçã«åå©çšã§ããªãããšãæå³ããŸãã
ã»ãšãã©ã®å ŽåãçŽç²ãªObjective-CãŸãã¯C ++ã®ã³ãŒãã掻çšããæ¹æ³ã¯ãå¿ èŠãªå Žæã§ã®ã¿Objective-C ++ã䜿çšããããšã§ãã ãããå®ç§ã«è¡ãã«ã¯ãè©ŠããŠã¿ãå¿ èŠããããŸãã
èªåã®è¶³ãæã€ïŒvoid *
ç®æšãããããŒãã¡ã€ã«ããC ++ãããã¹ãŠãåé€ããããšã§ããããšãæããã«ãªããŸãã åãé衚瀺ã«ããå žåçãªCã®æ¹æ³ã¯ãvoidãžã®ãã€ã³ã¿ãŒã§ãã ããã§ã¯ããã¡ããããããæ©èœããŸãïŒ
@interface MyClass : NSObject { @private // std::map<int, id>* void* lookupTable; } // ... @end
ããŒãã«ã䜿çšãããã³ãŒãã®ãããã®å Žæã§ã¯ãæ瀺çãªåãã£ã¹ãã䜿çšããå¿ èŠããããŸãïŒstatic_cast <std :: map <intãid> *>ïŒlookupTableïŒãŸãã¯ïŒïŒstd :: map <intãid> *ïŒlookupTableïŒéåžžã«è¿·æã«ãªããŸãã ã¯ã©ã¹ã¡ã³ãã®å®éã®åãå€æŽãããå Žåããã¹ãŠã®åå€æãæåã§å€æŽããå¿ èŠããããŸããããã«ãããééããèµ·ããå¯èœæ§ãå€§å¹ ã«å¢å ããŸãã ã¡ã³ããŒã®æ°ãå¢ãããšããã¹ãŠã®æ£ããåãèŠããããšãã§ããªããªãããã®çµæãéçåãšåçåã®äž¡æ¹ã®äžå©ãªç¹ãçããŸãã ãã®ã¡ãœããã䜿çšããŠã¯ã©ã¹éå±€ã®ãªããžã§ã¯ããæäœããããšã¯ãç«çœã䌎ãå±éºãªã²ãŒã ã§ãããåããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒA *ãšB *ãç°ãªãè¡šçŸãæã£ãŠããããšãå€æããå¯èœæ§ããããŸãvoid *
ããªãã¯ãã£ãšããŸããããã
æ¡ä»¶ä»ãã³ã³ãã€ã«
åæ å ±ã倱ãã®ã¯æªãããšã§ãããC ++åä»ããã£ãŒã«ãã¯Objective-Cã³ãŒããã䜿çšãããçŽç²ãªObjective-Cã³ã³ãã€ã©ã¯ãããã®ååšã®ã¿ãç¥ãå¿ èŠãããããïŒã¡ã¢ãªãæ£ããå²ãåœãŠãããïŒãã³ãŒãã®2ã€ã®ç°ãªãããŒãžã§ã³ãäœæããªãã§ãã ããïŒ Objective-C ++ã¯_cplusplusããªããã»ããµã·ã³ãã«ãå®çŸ©ããŠããããããã®å®è£ ã«ã€ããŠã¯ã©ãã§ããïŒ
#ifdef __cplusplus #include <map> #endif @interface MyClass : NSObject { @private #ifdef __cplusplus std::map<int, id>* lookupTable; #else void* lookupTable; #endif } // ... @end
glyãã§ãããäœæ¥ã¯ãã£ãšç°¡åã§ãã C ++æšæºã¯ãã¯ã©ã¹ãžã®ãã€ã³ã¿ãšvoidãžã®ãã€ã³ã¿ãåãã¡ã¢ãªäœçœ®ãæã€ããšãä¿èšŒããŸããïŒãªããžã§ã¯ãã¯ãã¡ããåãã§ãïŒããObjective-C ++ã¯GNU / Appleæšæºã§ã¯ãããŸããã å®éã«ã¯ãä»®æ³é¢æ°ãžã®ãã€ã³ã¿ã®ã¿ãvoid *ã«å€æãããšãã«åé¡ãåŒãèµ·ãããŸãããããå®è¡ããããšãããšãã³ã³ãã€ã©ã¯å€§å£°ã§èªããŸãã åé¡ã解決ããªãå Žåã¯ãCã¹ã¿ã€ã«ã®ãã£ã¹ãã®ä»£ããã«static_cast <>ã䜿çšã§ããŸãã
Cã¯æé»çã«void *ãæé»çã«ä»ã®ãã€ã³ã¿ãŒã«å°ããŸãããã®ãããCã®#ifdefã»ã¯ã·ã§ã³ããstruct MyPrefix_std_map_int_idãªã©ã®è€éã§ãããäžæã®èªèå¯èœãªååãæã€æ§é äœãžã®ãã€ã³ã¿ãŒã«çœ®ãæããããšãæãŸããå ŽåããããŸãã ã³ã³ãã€ã©ã«å¿ããŠãæ£ããåå®çŸ©ã«æ¡åŒµãããã¯ããå®çŸ©ããããšãã§ããŸãã
#ifdef __cplusplus #define OPAQUE_CPP_TYPE(cpptype, ctype) cpptype #else #define OPAQUE_CPP_TYPE(cpptype, ctype) struct ctype #endif // ... #ifdef __cplusplus #include <map> #endif @interface MyClass : NSObject { @private OPAQUE_CPP_TYPE(std::map<int, id>, cpp_std_map_int_id)* lookupTable; } // ... @end
ãã®æ¹æ³ã§ã¯ãæ¡ä»¶ä»ãã®#include C ++ããããŒãé¿ããããšãã§ãããC ++ãç¥ããªãããŸãã¯å«ããªäººãæ··ä¹±ãããå¯èœæ§ããããŸãã ã¯ããããã¯ããŸãèŠããŸããã 幞ããªããšã«ãä»ã®è§£æ±ºçããããŸãã
æœè±¡ã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ãããã³ãããã³ã«
å€ãã®C ++ããã°ã©ããŒã¯ãçŽç²ãªä»®æ³é¢æ°ããããã£ãŠæœè±¡ã¯ã©ã¹ã«éåžžã«ç²ŸéããŠããŸãã JavaãCïŒãªã©ã®ä»ã®èšèªã«ã¯ãå®è£ ã®è©³çŽ°ãæå³çã«é ãæ瀺çãªãã€ã³ã¿ãŒãã§ãŒã¹ãã®æŠå¿µããããŸãã ãã®å Žåãåããã¿ãŒã³ã䜿çšã§ããŸãã
Objective-Cã®æè¿ã®ããŒãžã§ã³ã¯ãæ§æã§ã¯ãªãã«ããŠããæ¬è³ªçã«Java / CïŒã€ã³ã¿ãŒãã§ã€ã¹ã«é¡äŒŒãããããã³ã«ããµããŒãããŠããŸãã ããããŒãã¡ã€ã«ã®ãããã³ã«ã§ã¯ã©ã¹ã®ãããªãã¯ã¡ãœããã宣èšããæå®ããããããã³ã«ãå®è£ ããç¹å®ã®ã¯ã©ã¹ãã¯ããŒãºããœãŒã¹ã³ãŒãã§å®£èšããŠèšè¿°ã§ããŸãïŒãããã£ãŠãC ++ãšObjective-Cã¯åé¢ãããŸãïŒã ããã¯ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã«å¯ŸããŠã¯æ©èœããŸããããããã³ã«ãä»ããŠã¯ã©ã¹ãçŽæ¥ã€ã³ã¹ã¿ã³ã¹åããããšã¯ã§ããŸããã ãã®ãããæ°ãããªããžã§ã¯ãã®ã¡ã¢ãªå²ãåœãŠãšåæåãã¯ã©ã¹ãã¡ã¯ããªãŸãã¯é¢æ°Cã«å§ä»»ããå¿ èŠããããŸããããã«æªãããšã«ããããã³ã«ã¯ããæå³ã§ã¯ã©ã¹ã«çŽäº€ããŠããããããªã³ã¯ã宣èšãããšãå€èŠ³ãç°ãªããŸãã
id<MyProtocol> ref;
äºæ³ããã代ããã«ïŒ
MyClass* ref;
ãã¹ãŠãæ©èœããŸãããçæ³çã§ããããŸããã
Objective-Cã®æœè±¡ã¯ã©ã¹
ã§ã¯ãæœè±¡ã¯ã©ã¹ã¯ã©ãã§ããããïŒ ãã®èšèªã§ã¯ããããã«å¯ŸããçŽæ¥çãªæ £çšçãªãµããŒãã¯ãããŸããããäžè¬çãªNSStringã§ããæœè±¡çã§ãããåã«äœ¿çšããã ãã§ã¯ãããç解ããããšã¯äžå¯èœã§ãã åé¡ã解決ãã1ã€ã®ä»£æ¿æ¹æ³ã¯ããã¹ãŠã®ã¡ãœãã宣èšãååŸãããããããã¹ãŠãã®ãããªã¯ã©ã¹ã«å ¥ããããšã§ãã äžå®å šãªã¯ã©ã¹èšè¿°ã«é¢ããã³ã³ãã€ã©ãŒã®èŠåã«èããå¿ èŠããããŸãã å®è¡æã«ãååšããªãã¡ãœãããåŒã³åºãããšãããšãäŸå€ãã¹ããŒãããŸãã ãã¡ãããç¶æ³ã説æããç¹å¥ãªäŸå€ãã¹ããŒãããããã®ã¡ãœããã®æ¬äŒŒå®è£ ãäœæã§ããŸãã
ã»ãšãã©ã®èšèªã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãäœæããã«ã¯ãç¹å®ã®ã¯ã©ã¹ãç¥ãããã¯ã©ã¹ãã¡ã¯ããªã«å§ä»»ããå¿ èŠããããŸãã èå³æ·±ãããšã«ãNSStringã¯ã©ã¹ã«allocããã³initã¡ãã»ãŒãžãçŽæ¥éä¿¡ã§ããNSStringããç¶æ¿ãããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸãã initã¡ãã»ãŒãžã¯ãinitãéä¿¡ãããself以å€ã®ãªããžã§ã¯ããè¿ããŸããããšãã°ãNSStringã®allocãåå®çŸ©ããŠNSCFStringãåŒã³åºãããšãã§ããŸããããã§ã¯ã¯ã©ã¹ãã¡ã¯ããªã¯NSStringã§ãã ãããèªåã§è¡ãå Žåãç¹å®ã®ã¯ã©ã¹ãæœè±¡ã«äœ¿çšãããã¹ãŠã®init *ã¡ãœãããå®çŸ©ããå¿ èŠããããŸããããããªããšãæœè±¡ã¡ãœããã䜿çšãã人ã«ã¯èŠããŸããã
ãããã£ãŠãæœè±¡ã¯ã©ã¹ã§ãã¹ãŠã®ã¡ãœããã宣èšããObjective-C ++ã¯ã©ã¹ããç¶æ¿ããããšã¯ãããããŒãã¡ã€ã«ããã³ãã®ã¯ã©ã¹ã䜿çšãããŠãŒã¶ãŒã«ãšã£ãŠééããªãæãç¡å¡µãªãœãªã¥ãŒã·ã§ã³ã§ãããåæã«æãæéãããããè¿œå ã®ã¯ã©ã¹ãæ¬äŒŒã¡ãœãããå¿ èŠã§ãããã³initã®éèŠãªå®è£ ã
ãã ããC ++ããã°ã©ããŒã¯ããã®ãããªåé¡ã®ãšã¬ã¬ã³ããªè§£æ±ºçãèŠã€ããŸããã 倧èŠæš¡ãªC ++ãããžã§ã¯ãã®é倧ãªåé¡ã®1ã€ã¯ãããããŒãã¡ã€ã«ã®äŸåé¢ä¿ã«é¢é£ããã³ã³ãã€ã«æéã®åçãªå¢å ã§ãã ãã®ãããªå Žåãéåžžãããã䜿çšããããã°ã©ãããã¯ã©ã¹å éšãé ããŸãã ãŸã£ããåããœãªã¥ãŒã·ã§ã³ãObjective-C / C ++ã®ãžã¬ã³ãã«é©çšã§ããŸãã
mplå
Pimpl-ãå®è£ ãžã®ãã€ã³ã¿ãŒããŸãã¯ããã©ã€ããŒãå®è£ ãã®ç¥ã ãã®ã€ãã£ãªã ã¯éåžžã«åçŽã§ãã æ§é äœã®å®è£ ã®ãªãŒãã³ãªèª¬æããªãŒãã³ããããŒãã¡ã€ã«ã«è¿œå ãããéåžžãæ¥å°ŸèŸImplãä»ãããããªãã¯ã¯ã©ã¹ã®ååã䜿çšããŠãèŠåã«ãã£ãŠç°ãªããŸãã ãã®æ§é äœã«ã¯ããããªãã¯ã¯ã©ã¹ããããŒãã¡ã€ã«ããé衚瀺ã«ããå¿ èŠããããã¹ãŠã®ã¡ã³ããŒãå«ãŸããŸãã ã¯ã©ã¹å€æ°ã®æ§é äœãžã®ãã€ã³ã¿ãŒãè¿œå ãã.cppãã¡ã€ã«ïŒãã®å Žåã¯.mmïŒã§æ§é äœã®ã¡ã³ããŒãå®çŸ©ããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒïŒããæ£ç¢ºã«ã¯ã-init *ïŒã§ã¯ãnewæŒç®åã䜿çšããŠãæ§é äœã®ã€ã³ã¹ã¿ã³ã¹ãäœæããã¯ã©ã¹å€æ°ã«å²ãåœãŠã-deallocã§deleteãåŒã³åºãããããšã確èªããå¿ èŠããããŸãã
MyClass.h: // ... struct MyClassImpl; @interface MyClass : NSObject { @private struct MyClassImpl* impl; } // ... - (id)lookup:(int)num; // ... @end MyClass.mm: #import "MyClass.h" #include <map> struct MyClassImpl { std::map<int, id> lookupTable; }; @implementation MyClass - (id)init { self = [super init]; if (self) { impl = new MyClassImpl; } return self; } - (void)dealloc { delete impl; [super dealloc]; } - (id)lookup:(int)num { std::map<int, id>::const_iterator found = impl->lookupTable.find(num); if (found == impl->lookupTable.end()) return nil; return found->second; } // ... @end
æ§é äœã®é²è¡äžã®å®£èšã¯æå¹ãªCã³ãŒãã§ãããããåŸã§æ§é äœã«æ瀺çãŸãã¯æé»çãªC ++ã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯èŠªã¯ã©ã¹ãå«ãŸããŠããããšãå€æããå Žåã§ãããã¹ãŠãæ©èœããŸãã ã¯ã©ã¹ã®ãããªãã¯ã¡ãœããã¯ããã€ã³ã¿ãŒãä»ããŠæ§é äœã«ã¢ã¯ã»ã¹ããnew / deleteã䜿çšããŠäœæãšåé€ãè¡ããŸãã
å®è£ ããªãŒãã³ã¯ã©ã¹ã¡ãœãããæã€æ©èœã®éã«äŸåããŸãã å Žåã«ãã£ãŠã¯Objective-Cã¡ãã»ãŒãžã®è»¢éãé¿ããã°ããã©ãŒãã³ã¹ãæ¹åã§ããŸãããC ++ã¡ãœãããObjective-Cã¯ã©ã¹ã«ã¡ãã»ãŒãžãéä¿¡ããå¿ èŠãããå Žåã«çºçããå¯èœæ§ã®ããåé¡ã«çæããŠãã ããã
MyClassã«æ§é ãå®è£ ãã代ããã«ãMyClassããMyClassãç¶æ¿ã§ããããšã«æ³šæããŠãã ããã ããã«ãããéæ¥åŒã³åºããåé¿ã§ããŸãã
@interface MyClass : NSObject { struct MyClassMap* lookupTable; } - (id)lookup:(int)i; @end and MyClass.mm: #import "MyClass.h" #include <map> struct MyClassMap : std::map<int, id> { }; @implementation MyClass - (id)init { self = [super init]; if (self) lookupTable = new MyClassMap; return self; } - (id)lookup:(int)i { MyClassMap::const_iterator found = lookupTable->find(i); return (found == lookupTable->end()) ? nil : found->second; } - (void)dealloc { delete lookupTable; lookupTable = NULL; [super dealloc]; } @end
ããããã¡ã³ããŒã®æ°ãå¢ãããšãå€æ°ã®æ°èŠ/åé€ã®ããã«ããã¯å®çšçã§ã¯ãªããªããŸãã
å¶éäºé
çŽç²ãªC ++ã§ã¯ãã¯ã©ã¹ã䜿çšããŠå®è£ ãè¡ãããšãã§ããŸãããObjective-Cã§ã¯å é ã®å®£èšãæ£ããå¿ èŠãããããããã®å Žåã¯æ©èœããŸããã C ++ã®æç®ã§ã¯ãshared_ptr <>ããã³auto_ptr <>ã䜿çšããŠãªããžã§ã¯ããèªåçã«åé€ããããã®æšå¥šäºé ãèŠã€ããããšãã§ããŸãã Objective-CããããŒãã¡ã€ã«ã§ã¯ãããã倱æããŸãã ãŸããæ§é äœãžã®ãã€ã³ã¿ãŒããéããããšã¯ã§ããŸãããããã¯ãã³ã³ãã€ã©ãŒãæ§é äœã«å²ãåœãŠãã¡ã¢ãªéãç¥ãå¿ èŠãããããã§ãã
å®è£ ã¯éããããŠããããã掟çã¯ã©ã¹ã®ã¡ã³ããŒã«çŽæ¥ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã ãã ããæ§é 宣èšãã»ãã¯ããŒãºããããŒãã¡ã€ã«ã«é 眮ã§ããŸããããããŒãã¡ã€ã«ã¯ããã®çŽæ¥ã¢ã¯ã»ã¹ãå¿ èŠãªåå«ã¯ã©ã¹ã«ã®ã¿å«ãŸããŸãã ãã®ãããªåå«ã¯ãObjective-C ++ã§äœæããå¿ èŠããããŸãã
æåŸã®èã
ããã§ããã»ãšãã©ãã¹ãŠã®å ŽåãObjective-Cã«C ++ãåã蟌ãã«ã¯ãPimplã®ã€ãã£ãªã ãæé©ãªéžæè¢ã§ãããšæããŸãã æ§é äœã«å«ãŸããã¡ã³ããŒã1ã€ã ãã®å Žåã§ããäžèŠãªåå€æããªããããéæ¥æ§ãè£åãããŸãã æ§é èªäœã¯ãã€ã³ã¿ã§ã¯ãªããããããã©ãŒãã³ã¹ã¯å€±ãããŸããã C ++ã§Objective-Cãæå¹ã«ããå¿ èŠãããå Žåã次ã®æ¹æ³ã§åãããšãã§ããŸãïŒããããŒãã¡ã€ã«ã§ã¯ã©ã¹ã®å®è£ ã®å®£èšã®åã«ããªãŒãã³C ++ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ãã察å¿ãã.mmãã¡ã€ã«ã«Objective-Cã¡ã³ããŒã®å®çŸ©ãé 眮ããŸãã