iphone - How to wrap a C++ lib in objective-C? -


मेरे पास सी ++ लाइब्रेरी (। केवल) है जिसमें डेटा संरचना का कार्यान्वयन होता है और मैं उसका उपयोग करना चाहता हूं मेरे iPhone ऐप में

सबसे पहले, मैंने उद्देश्य- C ++ को एक वर्ग के रूप में एक आवरण लिखा था, जो रचना के माध्यम से, सी ++ क्लास का एक आवर है। फिर मैं 'आभारी' को आवरण वर्ग विस्तार को .mm पर बदलने के लिए, और यह ठीक लग रहा था। लेकिन फिर मुझे इस लिपटे वर्ग फ़ाइल को कई अन्य फाइलों में शामिल करना होगा, इसलिए मुझे अपने विस्तार को भी बदलना होगा (संकलन समय की त्रुटियों की लहर को रोकने के लिए)

क्या मैं सही हूँ? क्या कुछ ही फाइलों में .एमएम एक्सटेंशन को 'कैबिन' करने का एक तरीका है? (और इस तरह से नाम संघर्ष रोकना आदि)

संपादित करें: कुछ और जानकारी जो मददगार हो सकती है, मैं एलएलवीएम 1.5 को कंपाइलर के रूप में उपयोग कर रहा हूं (मैंने देखा कि संकलन समय की गिनतीएं जीसीसी 4.2 से एलएलवीएम 1.5 तक बदलती हैं लेकिन मुझे यकीन नहीं है कि इसका मतलब बहुत है, क्योंकि मुझे उन सबके पास कोई नज़र नहीं था)

मेरी सिफारिश #ifdefs में सी + + बिट्स लपेट करना है:

  // MyWrapper.h #ifdef __cplusplus वर्ग ComposedClass; #endif @interface MyWrapper: NSObject {#ifdef __cplusplus ComposedClass * ptr; #endif} // यहाँ लिपटे विधियों ... @end  

यह पीआईएमपीएलएल मुहावरों का थोड़ा लंगड़ा संस्करण है, लेकिन कम कोड है, और सी + + - अपने शुद्ध उद्देश्य से आईएमएस छिपाने के लिए प्रभावी है -सी कोड Obvioulsy आप अपने MyWrapper.mm । में बनाये गये कोड को शामिल करना होगा।

यदि रचना कॉल एक templated है प्रकार, आपको पहले ब्लॉक को संशोधित करने की आवश्यकता होगी

  #ifdef __cplusplus #include "ComposedClass.h" #endif  

एक आगे घोषणा का उपयोग करने के बजाय और फिर, ज़ाहिर है, अपने उद्देश्य-सी क्लास 'इंस्टेंस वैरिएबल घोषणा में templated प्रकार का उपयोग करें।

यह दृष्टिकोण एप्पल में रनटाइम गुरु ग्रेग पार्कर, द्वारा किया गया था।

/ html>

Comments