उद्देश्य-सी के बजाय कोको के साथ सी ++ का उपयोग करें?


122

मैं उन अनुप्रयोगों को लिखना चाहता हूं जो C ++ और कोको फ्रेमवर्क का उपयोग करते हैं, क्योंकि Apple कार्बन 64-बिट को सक्षम नहीं बना रहा है। सी + + लिनक्स और विंडोज पर इसके कार्यान्वयन में बहुत अच्छा वेनिला लगता है लेकिन मैक ओएस एक्स पर ऐसा लगता है जैसे कोड के अतिरिक्त विशिष्ट विशिष्ट टुकड़े की आवश्यकता होती है (ओब्ज-सी रैपर की तरह)। ऐसा भी लगता है कि Apple डेवलपर्स को C ++ के बजाय Objective-C में लिखने के लिए मजबूर कर रहा है, हालांकि मैं गलत हो सकता हूं।

मैं मैक पर कोड लिखने के लिए एक रास्ता खोजने की कोशिश कर रहा हूं जो क्रॉस प्लेटफॉर्म को रखना आसान होगा। लिनक्स / विंडोज के लिए सी ++ में कोड लिखना और फिर ऑब्जेक्टिव-सी में बड़े हिस्से को फिर से लिखना बहुत ही अक्षम होगा।

क्या C ++ में कोड लिखने का एक तरीका है जो भविष्य के लिए समर्थित होगा और Xcode में समर्थित होगा? इसके अलावा, अगर यह संभव है, तो मैं Xcode में C ++ और Objective-C को कैसे मिलाऊंगा? धन्यवाद।

जवाबों:


110

आप कोको एप्लिकेशन को पूरी तरह से C ++ में नहीं लिख सकते। कोको अपने कई मुख्य प्रौद्योगिकियों जैसे की-वैल्यू बाइंडिंग, डेलीगेट्स (कोको शैली), और लक्ष्य-एक्शन पैटर्न के लिए ऑब्जेक्टिव-सी की देर से बाध्यकारी क्षमताओं पर निर्भर करता है। देर से बाध्यकारी आवश्यकताओं ने कोको एपीआई को एक संकलन-समयबद्ध, टाइप की गई भाषा जैसे C ++ it को लागू करना बहुत कठिन बना दिया है । आप निश्चित रूप से, एक शुद्ध सी ++ ऐप लिख सकते हैं जो ओएस एक्स पर चलता है। यह सिर्फ कोको एपीआई का उपयोग नहीं कर सकता है।

यदि आपके पास अन्य प्लेटफ़ॉर्म पर C ++ ऐप्स और अपने कोको-आधारित एप्लिकेशन के बीच कोड साझा करना चाहते हैं, तो आपके पास दो विकल्प हैं। पहला C ++ में मॉडल लेयर और कोको में GUI लिखना है। यह एक बहुत ही बड़े एप्लिकेशन द्वारा उपयोग किया जाने वाला एक सामान्य तरीका है, जिसमें Mathematica भी शामिल है । आपका C ++ कोड अपरिवर्तित छोड़ा जा सकता है (आपको OS X पर C ++ लिखने या संकलित करने के लिए "फंकी" ऐप्पल एक्सटेंशन की आवश्यकता नहीं है)। आपकी कंट्रोलर लेयर संभवतः ऑब्जेक्टिव-सी ++ (शायद "फंकी" Apple एक्सटेंशन जिसे आप संदर्भित करते हैं) का उपयोग करेगी। Objective-C ++ C ++ का एक सुपरसेट है, जैसा कि Objective-C, C. का एक सुपरसेट है। Objective-C ++ में, आप [some-objc-object callMethod];C ++ फ़ंक्शन के भीतर से objc-style मैसेज पासिंग कॉल (जैसे ) कर सकते हैं । इसके विपरीत, आप C ++ फ़ंक्शन को ObjC कोड के भीतर से कॉल कर सकते हैं जैसे:

@interface MyClass {
    MyCPPClass *cppInstance;
}
@end

@implementation MyClass
- (id)init {
    if(self = [super init]) {
        cppInstance = new MyCPPClass();
    }
    return self;
}
- (void) dealloc {
    if(cppInstance != NULL) delete cppInstance;
    [super dealloc];
}
- (void)callCpp {
    cppInstance->SomeMethod();
}
@end

आप Objective-C भाषा गाइड में Objective-C ++ के बारे में अधिक जानकारी प्राप्त कर सकते हैं । दृश्य परत तब शुद्ध उद्देश्य-सी हो सकती है।

दूसरा विकल्प क्रॉस-प्लेटफॉर्म C ++ टूलकिट का उपयोग करना है। क्यूटीटूलकिट बिल फिट हो सकता है। क्रॉस-प्लेटफ़ॉर्म टूलकिट आमतौर पर मैक उपयोगकर्ताओं द्वारा तिरस्कृत किए जाते हैं क्योंकि वे सभी विवरणों को बिल्कुल सही नहीं मानते हैं और मैक उपयोगकर्ता मैक अनुप्रयोगों के यूआई में पॉलिश की उम्मीद करते हैं। Qt, हालांकि, आश्चर्यजनक रूप से अच्छा काम करता है, और दर्शकों और आपके ऐप के उपयोग के आधार पर, यह काफी अच्छा हो सकता है। इसके अलावा, आप ओएस एक्स-विशिष्ट तकनीकों में से कुछ को खो देंगे जैसे कि कोर एनिमेशन और कुछ क्विक फ़ंक्शनल कार्यक्षमता, हालांकि क्यूटी एपीआई में अनुमानित प्रतिस्थापन हैं। जैसा कि आप बताते हैं, कार्बन 64-बिट में पोर्ट नहीं किया जाएगा। चूंकि क्यूटी को कार्बन एपीआई पर लागू किया गया है, इसलिए ट्रोलटेक / नोकिया को 64-बिट संगत बनाने के लिए क्यूटी को कोको एपीआई में पोर्ट करना पड़ा है। मेरी समझ यह है कि Qt का अगला रिले (वर्तमान में रिलीज कैंडिडेट में है) इस संक्रमण को पूरा करता है और ओएस एक्स पर 64-बिट संगत है। यदि आप सी ++ और कोको एपीआई को एकीकृत करने में रुचि रखते हैं, तो आप क्यूटी 4.5 के स्रोत पर एक नज़र डाल सकते हैं।


To थोड़ी देर के लिए ऐप्पल ने कोको एपीआई को जावा के लिए उपलब्ध कराया, लेकिन पुल को व्यापक हाथ-ट्यूनिंग की आवश्यकता थी और ऊपर वर्णित की-वैल्यू बाइंडिंग जैसी अधिक उन्नत प्रौद्योगिकियों को संभालने में असमर्थ था। वर्तमान में गतिशील रूप से टाइप की गई, रनटाइम-बाउंड भाषाएं जैसे पायथन, रूबी, आदि ऑब्जेक्टिव-सी के बिना कोको ऐप लिखने के लिए एकमात्र वास्तविक विकल्प हैं (हालांकि इन पुलों में हुड के तहत ऑब्जेक्टिव-सी का उपयोग होता है)।


मैं वर्तमान में अपने छोटे Ogre3D एप्लिकेशन को पोर्ट करने की कोशिश कर रहा हूं, बहुत दर्दनाक लगता है। क्या सेब सभी को ओब्जेक्ट में बदलने की कोशिश कर रहा है, या यह वास्तव में एक विशेषता है?
19:59 पर जोक

68

खैर, यह मूर्खतापूर्ण लग सकता है, लेकिन वास्तव में हम मैक ओएस एक्स के लिए जीयूआई बनाने के लिए शुद्ध सी ++ कोड लिख सकते हैं, लेकिन हमें कोको फ्रेमवर्क के खिलाफ लिंक करना होगा।

/*
 * test1.cpp
 * This program shows how to access Cocoa GUI from pure C/C++
 * and build a truly functional GUI application (although very simple).
 * 
 * Compile using:
 *   g++ -framework Cocoa -o test1 test1.cpp
 *
 * that will output 'test1' binary.
 */


#include <CoreFoundation/CoreFoundation.h>
#include <objc/objc.h>
#include <objc/objc-runtime.h>
#include <iostream>

extern "C" int NSRunAlertPanel(CFStringRef strTitle, CFStringRef strMsg,
                               CFStringRef strButton1, CFStringRef strButton2, 
                               CFStringRef strButton3, ...);


int main(int argc, char** argv)
{
    id app = NULL;
    id pool = (id)objc_getClass("NSAutoreleasePool");
    if (!pool)
    {
        std::cerr << "Unable to get NSAutoreleasePool!\nAborting\n";
        return -1;
    }
    pool = objc_msgSend(pool, sel_registerName("alloc"));
    if (!pool)
    {
        std::cerr << "Unable to create NSAutoreleasePool...\nAborting...\n";
        return -1;
    }
    pool = objc_msgSend(pool, sel_registerName("init"));

    app = objc_msgSend((id)objc_getClass("NSApplication"),
                       sel_registerName("sharedApplication"));

    NSRunAlertPanel(CFSTR("Testing"),
                    CFSTR("This is a simple test to display NSAlertPanel."),
                    CFSTR("OK"), NULL, NULL);

    objc_msgSend(pool, sel_registerName("release"));
    return 0;
}

17
यह अद्भुत है। क्या अधिक जटिल उदाहरण उपलब्ध हैं? उदाहरण के लिए, NSWindow खोलना?
22

test1.cpp: फ़ंक्शन में 'int main (इंट, char **)': test1.cpp: 26: 48: error: आरम्भिकरण आईडी में 'class {aka objc_class *}' को 'id {aka objc_obassApp "} में परिवर्तित नहीं कर सकता। पूल = objc_getClass ("NSAutoreleasePool"); ^ test1.cpp: 41: 61: त्रुटि: 'class {aka objc_class *}' को 'id {aka objc_object *}' को तर्क '1' के लिए 'objc_object' - objc_msgSend (id, SEL, ...) में परिवर्तित नहीं कर सकता। sel_registerName ( "sharedApplication")); ^
जिचाओ

6
@ जिचा को आंतरिक उद्देश्य-सी प्रकारों के साथ क्लैंग संगतता दिखाई देती है - फिक्स सरल है: इसके objc_getClassसाथ बदलें(id)objc_getClass
दिमित्री इसव

उदाहरण के लिए, मैं एक std :: string का उपयोग कैसे कर सकता हूं। चेतावनी पैनल के लिए शीर्षक? मैंने
c_str

1
यह
macOS

18

हां, आप केवल C ++ (अर्थात इसे * .cpp फ़ाइलों में लिख रहे हैं) और यहां तक ​​कि C ++ और Objective-C को * .mm फ़ाइलों (मानक ऑब्जेक्टिव-सी कोड * .m फ़ाइलों में संग्रहीत) का उपयोग कर सकते हैं।

बेशक, आपको अभी भी अपने यूजर-इंटरफेस के लिए ऑब्जेक्टिव-सी का उपयोग करना है और अपने सी ++ ऑब्जेक्ट्स के लिए ऑब्जेक्टिव-सी रैपर बनाना है। एक अन्य विकल्प क्यूटी पर स्विच करना है जो एक सी ++ फ्रेमवर्क है जो विंडोज, मैक ओएस एक्स और लिनक्स का समर्थन करता है - और एलजीपीएल के तहत अगले संस्करण 4.5 के साथ जारी किया जाएगा।


23
ध्यान दें कि यदि आप Qt का उपयोग करते हैं, तो आपका ऐप बेकार हो जाएगा। Qt- आधारित ऐप मूल मैक ऐप्स की तरह नहीं दिखते और महसूस करते हैं। (एक उदाहरण के लिए, Google धरती देखें।)
पीटर होसे

15
पीटर: यह बिल्कुल सच नहीं है। Qt- आधारित ऐप मूल मैक ऐप्स के समान दिख सकते हैं और महसूस कर सकते हैं, आपको बस प्रति-प्लेटफॉर्म ट्विकिंग करने की आवश्यकता है, प्रत्येक प्लेटफ़ॉर्म पर देशी जीयूआई लिखने की तुलना में बहुत आसान है।
माइक मैकक्विड

12
माइक, आप गलत हैं। उनकी अन्य कमियों के बीच, मैक पर क्यूटी-आधारित एप्लिकेशन देशी नियंत्रणों का उपयोग बिल्कुल नहीं करते हैं, और क्यूटी पुस्तकालय सभी ड्राइंग को स्वयं करता है। इसका मतलब यह है कि Qt ऐप्स को 2D रेंडरिंग के लिए कोई हार्डवेयर त्वरण नहीं मिलता है, वे UI परिवर्तनों के साथ नहीं रहते हैं जो Apple मानक नियंत्रण में करता है, और Qt ऐप ADA अनुपालन या स्क्रिप्टबिलिटी प्रदान नहीं कर सकता है जब तक कि आप उन पर लगाम नहीं लगाते। अपने आप को पहियों। दूसरे शब्दों में, मैक पर एक क्यूटी एप्लिकेशन को जहाज करने के लिए न करें। Google इससे दूर हो सकता है: आप नहीं कर सकते।
NSResponder

13
वे देशी नियंत्रण का उपयोग करते हैं, यही कारण है कि क्यूटी का कोको और कार्बन संस्करण है। इसके अन्य मुद्दे हैं लेकिन बहुत सारे लोग मैक पर क्यूटी अनुप्रयोगों को भेजते हैं और वे ठीक काम करते हैं (और पूरी तरह से थोड़ा ट्वीकिंग के साथ)।
माइक मैकक्विड 18

2
केवल देशी नियंत्रण का उपयोग करने का मतलब यह नहीं है कि यह देशी ऐप्स की तरह दिखेगा और महसूस करेगा । क्या करता है एक देशी लग रहा है प्रत्येक ओएस का अंतर है। यदि आप अपने ऐप को किसी विशिष्ट प्लेटफ़ॉर्म में महसूस करने के लिए ट्यून करते हैं, तो यह किसी अन्य प्लेटफ़ॉर्म पर देशी नहीं लगेगा। और, एक बार अमूर्त परत पर छोटे व्यवहार की बारीक-बारी से देशी परत पर करने से हमेशा कठिन होता है।
eonil

9

हाँ आप उन्हें मिला सकते हैं।

आपको अपने GUI ऑब्जेक्ट्स पर सीधे काम करने और उनसे सूचनाएं प्राप्त करने के लिए Objective-C का उपयोग करना होगा।

इन ऑब्जेक्टिव-सी ऑब्जेक्ट को सीधे C ++ लॉजिक कह सकते हैं यदि आप इन्हें शुद्ध ऑब्जेक्टिव-सी। एम। एम। फाइल्स के बजाय .MM फाइल में रखते हैं। ध्यान दें कि आप उद्देश्य-सी ++ को इंगित करने के लिए एक अपरकेस (.M) का उपयोग करने की सलाह देते हुए (बहुत) पुरानी सलाह देख सकते हैं, लेकिन यह बहुत ही परतदार है और आपको भ्रमित करने की संभावना है।

आपको प्रत्येक C ++ ऑब्जेक्ट को लपेटने की आवश्यकता नहीं है, लेकिन आपके ऑब्जेक्टिव-सी कोड को उन्हें पॉइंटर्स शामिल करने की आवश्यकता होगी।

Apple अब ऐसा करने वाले किसी भी नमूने को प्रकाशित नहीं करता है।

पीटर स्टीनबर्गर द्वारा रियलम [उद्देश्य] C ++ में होस्ट किया गया एक शानदार वीडियो है : क्या संभवत: गलत हो सकता है? मैं अभी भी उद्देश्य-सी ++ का उपयोग कर किसी के लिए अत्यधिक अनुशंसा करता हूं और आप जल्दी से प्रतिलिपि को स्किम कर सकते हैं।


@ अपने लिंक को भी तोड़ दिया है
fferri

@fferi - ऊपर स्टीनबर्गर लिंक तय है। कार्बन कोको इंटीग्रेशन डेवलपर 2007 से था। Apple ने इसे हटा दिया। यह इंगित करता है कि आप वास्तव में कार्बन एपीआई का उपयोग करके नया कोड नहीं लिख रहे हैं। इस बिंदु पर, कार्बन का उपयोग करके मौजूदा कोड को बनाए रखना जोखिम भरा है। इस प्रश्न के लिए स्वीकृत उत्तर का संदर्भ लें, या यह एक अगर आपको C ++ / Objective C को मिलाना है, लेकिन आपको कार्बन का उपयोग नहीं करना चाहिए। इसने कहा, यहां: कार्बन-कोको-एकीकरण
स्टीव्स

4

यदि आप केवल सादे वेनिला सी ++ का उपयोग करना चाहते हैं, तो यह बिल्कुल समर्थित है और वास्तव में किसी भी अन्य प्लेटफॉर्म से अलग नहीं है। Xcode के पास फ़ाइल> नई परियोजना> कमांड लाइन उपयोगिता> C ++ टूल के तहत इसके लिए एक टेम्प्लेट भी है। इसके अलावा, कई लोकप्रिय ओपन-सोर्स लाइब्रेरी (libcurl, libxml2, sqlite, आदि) OS X के साथ आते हैं और डायनेमिक लिंकिंग के लिए उपलब्ध हैं। यदि आप नहीं चाहते हैं तो आपको कोको या कुछ भी एप्पल-विशिष्ट का उपयोग करने की आवश्यकता नहीं है।

यदि आप अपने ऐप के कुछ हिस्सों में कोको का उपयोग करना चाहते हैं, तो Objective-C ++ पर एक नज़र डालें । आप उसी फ़ाइल में .mm, या Xcode में फ़ाइल पर राइट-क्लिक करके और Get Info> General का चयन करके और फिर फ़ाइल प्रकार को sourcecode.cpp.objcpp में बदलकर C ++ और Objective-C को मिला सकते हैं। दूसरा विकल्प उपयोगी है यदि आपके पास एक .cpp फ़ाइल है जहाँ आप Mac-specific #ifdef के अंदर Objective-C का उपयोग करना चाहते हैं।


1
BTW, (वास्तव में उपयोगी) C ++ टेम्पलेट Xcode (4.x और 5.x) के हाल के संस्करणों के साथ चला गया है
Jay

1

हालांकि यह सालों पुराना सवाल है ...

मैंने कुछ कोको वर्गों के सी ++ आवरण बनाने की कोशिश की है

यह बहुत अच्छा अनुभव था। C ++ ने Objective-C की तुलना में बेहतर प्रकार की सुरक्षा प्रदान की, और मुझे कम कोड लिखने के लिए बनाया। लेकिन संकलन समय और स्मृति सुरक्षा बदतर हैं। यह संभव है लेकिन कुछ गतिशील आधारित सुविधाओं को संभालना आसान नहीं था। मुझे लगता है कि C ++ पर इससे निपटने का कोई मतलब नहीं है।

वैसे भी स्विफ्ट की घोषणा के कारण मेरी परियोजना को अंततः छोड़ दिया गया था। इसने उन सभी कारणों को साफ़ कर दिया जो मैं पहली बार C ++ का उपयोग करना चाहता था, और इससे भी अधिक और बेहतर प्रदान करता है।


0

यदि आप विशुद्ध रूप से चित्रमय अनुप्रयोग लिख रहे हैं, यानी आप कोड का उपयोग करके सब कुछ ड्राइंग कर रहे हैं, तो ओपनफ़्रेमवर्क पर विचार करें । यह C / C ++ के शीर्ष पर निर्मित एक Openource चित्रमय प्रोग्रामिंग भाषा है। इसमें ऐसे ऐड हैं जो लोगों को भाषा का विस्तार करने की अनुमति देते हैं। उनके पास iphone के लिए एक addon है । मेरा मानना ​​है कि यह लाइब्रेरी और एक्सकोड परियोजनाओं के साथ आता है जो आपको आईफोन और आईपॉड टच के लिए ऐप संकलित करने में मदद करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.