উদ্দেশ্য-সি এর পরিবর্তে কোকো দিয়ে সি ++ ব্যবহার করবেন?


122

আমি অ্যাপ্লিকেশনগুলি লিখতে চাই যা সি ++ এবং কোকো ফ্রেমওয়ার্ক ব্যবহার করে কারণ অ্যাপল কার্বনকে 64-বিট সক্ষম করে না। লিনাক্স এবং উইন্ডোজে এটি কার্যকর করার ক্ষেত্রে সি ++ দেখতে বেশ ভ্যানিলা বলে মনে হচ্ছে তবে ম্যাক ওএস এক্সে মনে হচ্ছে অতিরিক্ত অ্যাপল নির্দিষ্ট কোডের প্রয়োজন (যেমন একটি ওবজ-সি র‌্যাপার)। এটিও মনে হয় যে অ্যাপল বিকাশকারীদের সি ++ এর চেয়ে অবজেক্টিভ-সিতে লিখতে বাধ্য করছে, যদিও আমি ভুল হতে পারি।

আমি ম্যাকের জন্য এমন একটি লিখনের পথ খুঁজতে চেষ্টা করছি যা ক্রস প্ল্যাটফর্ম রাখা সহজ হবে। লিনাক্স / উইন্ডোজের জন্য সি ++ তে কোড লিখতে হবে এবং তারপরে ওজেক্টিভ-সিতে বড় অংশগুলি আবার লিখতে হবে খুব অকার্যকর।

সি ++ তে কোড লেখার কোনও উপায় কি ভবিষ্যতের জন্য সমর্থিত এবং এক্সকোডে সমর্থিত হবে? এছাড়াও, যদি এটি সম্ভব হয় তবে আমি কীভাবে এক্সকোডে সি ++ এবং উদ্দেশ্য-সি মিশ্রণ করব? ধন্যবাদ।

উত্তর:


110

আপনি পুরোপুরি সি ++ তে কোকো অ্যাপ্লিকেশন লিখতে পারবেন না। কী-ভ্যালু বাইন্ডিংস, ডেলিগেটস (কোকো স্টাইল) এবং টার্গেট-অ্যাকশন প্যাটার্নের মতো অনেকগুলি মূল প্রযুক্তিগুলির জন্য ওজেক্টিভ-সি এর দেরীতে আবদ্ধ করার ক্ষমতার উপর কোকো প্রচুর নির্ভর করে। দেরীতে বাইন্ডিংয়ের প্রয়োজনীয়তাগুলি সি ++ like এর মতো টাইপিত ভাষার সংকলন-সময়সীমার মধ্যে কোকো এপিআই প্রয়োগ করা খুব কঠিন করে তোলে ⁱ আপনি, অবশ্যই, একটি খাঁটি সি ++ অ্যাপ্লিকেশন লিখতে পারেন যা ওএস এক্সে চলে। এটি কেবল কোকো এপিআইগুলি ব্যবহার করতে পারে না।

সুতরাং, আপনি যদি অন্য প্ল্যাটফর্মের সি ++ অ্যাপ্লিকেশন এবং আপনার কোকো ভিত্তিক অ্যাপ্লিকেশনগুলির মধ্যে কোড ভাগ করতে চান তবে আপনার কাছে দুটি বিকল্প রয়েছে। প্রথমটি হল C ++ এ মডেল স্তর এবং কোকোতে GUI লিখুন। এটি ম্যাথমেটিকাসহ কয়েকটি খুব বড় অ্যাপ্লিকেশান দ্বারা ব্যবহৃত একটি সাধারণ পন্থা । আপনার সি ++ কোডটি অপরিবর্তিত রেখে দেওয়া যেতে পারে (ওএস এক্সে সি ++ লিখতে বা সংকলনের জন্য আপনার "ফানকি" আপেল এক্সটেনশনগুলির প্রয়োজন নেই)। আপনার নিয়ামক স্তরটি সম্ভবত উদ্দেশ্য-সি ++ ব্যবহার করবে (সম্ভবত "মজাদার" অ্যাপল এক্সটেনশান আপনি উল্লেখ করেছেন)। অবজেক্টিভ-সি ++ হ'ল সি ++ এর একটি সুপারসেট, যেমন ওজেক্টিভ-সি সি-র একটি সুপারসেট, অবজেক্টিভ-সি ++ তে আপনি [some-objc-object callMethod];সি ++ ফাংশনের মধ্যে থেকে অবজেক্ট-স্টাইল মেসেজ পাসিং কলগুলি (যেমন ) করতে পারেন । বিপরীতে, আপনি ওবিজেসি কোডের মধ্যে থেকে সি ++ ফাংশনগুলি কল করতে পারেন:

@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

আপনি উদ্দেশ্য-সি ভাষা সম্পর্কে আরও জানতে পারেন - উদ্দেশ্য-সি ভাষা নির্দেশিকাতে । এরপরে দৃশ্য স্তরটি বিশুদ্ধ অবজেক্টিভ-সি হতে পারে।

দ্বিতীয় বিকল্পটি হ'ল ক্রস-প্ল্যাটফর্ম সি ++ টুলকিট ব্যবহার করা। কিউটিটুলকিটটি বিলটি ফিট করতে পারে। ক্রস প্ল্যাটফর্মের সরঞ্জামকিটগুলি ম্যাক ব্যবহারকারীরা সাধারণত ঘৃণা করেন কারণ তারা সমস্ত চেহারা খুঁজে পান না এবং বিবরণটি ঠিক ঠিক অনুভব করে না এবং ম্যাক ব্যবহারকারীরা ম্যাক অ্যাপ্লিকেশনগুলির ইউআইতে পোলিশ আশা করে। কিউটি আশ্চর্যজনকভাবে ভাল কাজ করে, তবে দর্শকদের এবং আপনার অ্যাপ্লিকেশনটির ব্যবহারের উপর নির্ভর করে এটি যথেষ্ট ভাল হতে পারে। এছাড়াও, আপনি কিউটি এপিআই-তে আনুমানিক প্রতিস্থাপনের পরেও কিছু OS X- নির্দিষ্ট প্রযুক্তি যেমন কোর অ্যানিমেশন এবং কিছু কুইকটাইম কার্যকারিতা হারাবেন। আপনি উল্লেখ হিসাবে, কার্বন 64-বিট পোর্ট করা হবে না। যেহেতু কিউটি কার্বন এপিআইগুলিতে প্রয়োগ করা হয়েছে, তাই ট্রলটেক / নোকিয়া কেও কোপিও এপিআইতে 64৪-বিট সামঞ্জস্যপূর্ণ করতে পোর্ট করতে হয়েছিল। আমার বোধগম্যতা হ'ল কিউটির পরবর্তী সম্পর্কিত (বর্তমানে রিলিজ মোমিয়েটতে রয়েছে)) এই রূপান্তরটি সম্পূর্ণ করে এবং ওএস এক্সের সাথে 64৪-বিট সামঞ্জস্যপূর্ণ you're. আপনি যদি সি ++ এবং কোকো API গুলি সংহত করতে আগ্রহী হন তবে Qt 4.5 এর উত্সটি একবার দেখতে চান।


While কিছুক্ষণের জন্য অ্যাপল জাভাতে কোকো এপিআই সরবরাহ করেছিল, তবে সেতুর জন্য হ্যান্ড-টিউনিংয়ের ব্যাপক প্রয়োজন ছিল এবং উপরে বর্ণিত কী-ভ্যালু বাইন্ডিংয়ের মতো আরও উন্নত প্রযুক্তিগুলি পরিচালনা করতে অক্ষম ছিল। বর্তমানে গতিশীলভাবে টাইপ করা হয়েছে, রানটাইম-বেঁধে থাকা পাইথন, রুবি ইত্যাদির মতো ভাষাগুলি হ'ল অবজেক্টিভ-সি ছাড়াই কোকো অ্যাপ্লিকেশন লেখার একমাত্র আসল বিকল্প (যদিও এই ব্রিজগুলি হুডের নীচে উদ্দেশ্য-সি ব্যবহার করে)।


আমি বর্তমানে আমার ছোট Ogre3D অ্যাপ্লিকেশনটি পোর্ট করার চেষ্টা করছি, খুব বেদনাদায়ক বলে মনে হচ্ছে। আপেল কি সবাইকে ওজজিতে রূপান্তরিত করার চেষ্টা করছে বা এটি কি আসলেই কোনও বৈশিষ্ট্য?
জোকুন

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
এটা চমৎকার. আরও জটিল উদাহরণ উপলব্ধ আছে? উদাহরণস্বরূপ, একটি এনএসওয়াইন্ডো খোলার?
imallett

test1.cpp: ফাংশনে 'int main (int, চর **)': test1.cpp: 26: 48: ত্রুটি: 'ক্লাস {ওরফে অবজেক্ট_ক্লাস *}' কে 'আইডি {ওরফে অবজেক্ট_বজেক্ট * to' এ আরম্ভের আইডিতে রূপান্তর করতে পারে না পুল = অবজেক্ট_জেটক্লাস ("এনএসএটোরেলিজপুল"); 1 test1.cpp: 41: 61: ত্রুটি: 'শ্রেনী {ওরফে অবজেক্ট_ক্লাস *}' কে 'আইডি obj ওরফে অবজেক্ট_বজেক্ট *}' এ আর্গুমেন্টের জন্য "1" থেকে 'অবজেক্ট_বজেক্ট * অবজেক্ট_এমএসএসেন্ড (আইডি, সেল, ...)' রুপান্তর করতে পারে না ' sel_registerName ( "sharedApplication")); ^
জিচাও

6
@Jichao সঙ্গে ঝনঝন সামঞ্জস্য দেখতে অভ্যন্তরীণ উদ্দেশ্য সি ধরনের - ফিক্স সহজ: প্রতিস্থাপন objc_getClassসঙ্গে(id)objc_getClass
দিমিত্রি Isaev

উদাহরণস্বরূপে আমি কীভাবে একটি std :: স্ট্রিং ব্যবহার করতে পারি। সতর্কতা প্যানেলের জন্য শিরোনাম? আমি c_str () এবং একই রকম ব্যবহার করার চেষ্টা করেছি কিন্তু কিছুই কার্যকর হয়নি ...
mdre

1
এটি আর
ম্যাকস

18

হ্যাঁ, আপনি কেবল সি ++ ব্যবহার করতে পারেন (অর্থাত্ * .cpp ফাইলগুলিতে এটি লিখে) এবং এমনকি সি।

অবশ্যই, আপনাকে এখনও আপনার ইউজার-ইন্টারফেসের জন্য অবজেক্টিভ-সি ব্যবহার করতে হবে এবং আপনার সি ++ অবজেক্টগুলির জন্য অবজেক্টিভ-সি র‌্যাপার তৈরি করতে হবে। অন্য বিকল্পটি হ'ল কিউটি তে স্যুইচ করা যা একটি সি ++ ফ্রেমওয়ার্ক যা উইন্ডোজ, ম্যাক ওএস এক্স, এবং লিনাক্সকে সমর্থন করে - এবং পরবর্তী সংস্করণ ৪.৪ সহ এলজিপিএল এর অধীনে প্রকাশিত হবে।


23
মনে রাখবেন যে আপনি কিউটি ব্যবহার করেন, আপনার অ্যাপ্লিকেশন স্তন্যপান হবে। কিউটি-ভিত্তিক অ্যাপ্লিকেশনগুলি দেশীয় ম্যাক অ্যাপ্লিকেশনগুলির মতো লাগে না এবং অনুভব করে না। (উদাহরণস্বরূপ, গুগল আর্থ দেখুন))
পিটার হোসি

15
পিটার: এটা মোটেও সত্য নয়। কিউটি-ভিত্তিক অ্যাপ্লিকেশনগুলি নেটিভ ম্যাক অ্যাপ্লিকেশনগুলির অনুরূপ দেখতে এবং অনুভব করতে পারে, আপনাকে কেবল প্রতি প্ল্যাটফর্মের টুইটগুলি করতে হবে, যা প্রতিটি প্ল্যাটফর্মে নেটিভ জিআইআই লেখার চেয়ে অনেক সহজ।
মাইক ম্যাককয়েড

12
মাইক, আপনি ভুল তথ্য দিয়েছেন। তাদের অন্যান্য ত্রুটিগুলির মধ্যে ম্যাকের কিউটি-ভিত্তিক অ্যাপগুলি নেটিভ নিয়ন্ত্রণগুলি মোটেই ব্যবহার করে না এবং কিউটি লাইব্রেরি সমস্ত অঙ্কন নিজেই করে। এর অর্থ হ'ল কিউটি অ্যাপ্লিকেশনগুলি 2 ডি রেন্ডারিংয়ের জন্য কোনও হার্ডওয়্যার ত্বরণ পায় না, অ্যাপল স্ট্যান্ডার্ড নিয়ন্ত্রণগুলিতে করে এমন UI পরিবর্তনগুলির সাথে তারা সমন্বয় করে না এবং কোনও Qt অ্যাপ্লিকেশন এডিএ সম্মতি বা স্ক্রিপ্টিবিলিটি সরবরাহ করতে পারে না যদি আপনি সেগুলি পুনরায় সংশোধন না করেন নিজেকে চাকা। অন্য কথায়, ম্যাকের উপর একটি কিউটি অ্যাপ্লিকেশন শিপ করার চেষ্টা করবেন না। গুগল এটি দিয়ে দূরে যেতে পারে: আপনি পারবেন না।
এনএসআরসপন্ডার

13
তারা নেটিভ নিয়ন্ত্রণগুলি ব্যবহার করে, এ কারণেই কিউটির একটি কোকো এবং কার্বন সংস্করণ রয়েছে। এটিতে অন্যান্য সমস্যা রয়েছে তবে প্রচুর লোকেরা ম্যাকের উপর কিউটি অ্যাপ্লিকেশন সরবরাহ করে এবং তারা ভাল কাজ করে (এবং পুরোপুরি টুইট করার জন্য)।
মাইক ম্যাককয়েড

2
কেবল নেটিভ নিয়ন্ত্রণ ব্যবহারের অর্থ এই নয় যে এটি স্থানীয় অ্যাপ্লিকেশনগুলির মতো দেখায় এবং অনুভব করবে । যা একটি দেশীয় অনুভূতি তোলে তা প্রতিটি ওএসের পার্থক্য । আপনি যদি আপনার অ্যাপটিকে কোনও নির্দিষ্ট প্ল্যাটফর্মে অনুভূত করার জন্য টিউন করেন তবে এটি অন্য প্ল্যাটফর্মের নেটিভ অনুভূত হবে না। এবং একবার বিমূর্ত স্তরে ছোট আচরণের সূক্ষ্ম সুরকরণ নেটিভ স্তরের উপরে করা থেকে সবসময় শক্ত।
eonil

9

হ্যাঁ আপনি তাদের মিশ্রিত করতে পারেন।

আপনার GUI অবজেক্টগুলিতে সরাসরি পরিচালনা করতে এবং সেগুলি থেকে বিজ্ঞপ্তিগুলি গ্রহণ করতে আপনাকে উদ্দেশ্য-সি ব্যবহার করতে হবে।

এই অবজেক্টিভ-সি অবজেক্টগুলি আপনি বিশুদ্ধ অবজেক্টিভ-সি। এম ফাইলগুলির পরিবর্তে। মিমি ফাইলগুলিতে রাখলে সরাসরি সি ++ যুক্তিকে কল করতে পারবেন। নোট করুন যে আপনি দেখতে পেলেন (অনেক বেশি) পুরানো পরামর্শ যেহেতু বড় হাতের অক্ষর ব্যবহারের পরামর্শ দিচ্ছে। এম। অবজেক্টিভ-সি ++ নির্দেশ করতে কিন্তু এটি খুব কমদামি এবং সংকলকটি আপনাকে বিভ্রান্ত করার সম্ভাবনা রয়েছে।

আপনাকে প্রতিটি এবং প্রতিটি সি ++ অবজেক্টটি মোড়ানোর দরকার নেই তবে আপনার উদ্দেশ্য-সি কোডটিতে তাদের পয়েন্টার থাকতে হবে।

অ্যাপল আর কীভাবে এটি করবেন তা দেখায় কোনও নমুনা প্রকাশ করে না।

পিটার স্টেইনবার্গারের একটি দুর্দান্ত ভিডিও রয়েছে যা রিয়েলমে [উদ্দেশ্য] সি ++ তে হোস্ট করা আছে : সম্ভবত কী ভুল হতে পারে? আমি এখনও অবজেক্টিভ-সি ++ ব্যবহার করে এমন কাউকে জন্য অত্যন্ত পরামর্শ দিচ্ছি এবং আপনি দ্রুত ট্রান্সক্রিপ্ট স্কিম করতে পারেন।


@ স্টিভ আপনার লিঙ্কটি খুব বেশি ভাঙা হয়েছে
ফেব্রুয়ারি

@ ফিফি - উপরের স্টেইনবার্গারের লিঙ্কটি স্থির হয়েছে। কার্বন কোকো ইন্টিগ্রেশন 2007 থেকে ডেভেলপার.এপল.কম থেকে ছিল, অ্যাপল এটিকে সরিয়ে দিয়েছে। এটি ইঙ্গিত করে যে আপনি সত্যিই কার্বন এপিআই ব্যবহার করে নতুন কোড লিখবেন না। এই মুহুর্তে, এমনকি কার্বন ব্যবহার করে বিদ্যমান কোড বজায় রাখা ঝুঁকিপূর্ণ। এই প্রশ্নের, অথবা জন্য গৃহীত উত্তর পড়ুন এই এক আপনি মিশে সি ++ / উদ্দেশ্য সি প্রয়োজন, কিন্তু আপনার কার্বন না ব্যবহার করা উচিত। এটি বলেছিল, এখানে: কার্বন-কোকো-
সংহতকরণ

4

যদি আপনি কেবল সাদামাটা ভ্যানিলা সি ++ ব্যবহার করতে চান তবে এটি একেবারেই সমর্থিত এবং অন্য কোনও প্ল্যাটফর্মের চেয়ে সত্যিই আলাদা নয়। এমনকি ফাইল> নতুন প্রকল্প> কমান্ড লাইন ইউটিলিটি> সি ++ সরঞ্জাম এর অধীনে এক্সকোডের কাছে এটির জন্য একটি টেম্পলেট রয়েছে। এছাড়াও, বেশ কয়েকটি জনপ্রিয় ওপেন সোর্স লাইব্রেরি (libcurl, libxML2, স্ক্লাইট, ইত্যাদি) ওএস এক্স এর সাথে আসে এবং গতিশীল লিঙ্কিংয়ের জন্য উপলব্ধ। আপনি না চাইলে আপনাকে কোকো বা অ্যাপল-নির্দিষ্ট কিছু ব্যবহার করতে হবে না।

আপনি যদি আপনার অ্যাপ্লিকেশনের কিছু অংশে কোকো ব্যবহার করতে চান তবে অবজেক্টিভ-সি ++ দেখুন । আপনি একই ফাইলটিকে। মিমি এর একটি এক্সটেনশান দিয়ে বা সিঙ্কডে ফাইলটিতে ডান ক্লিক করে এবং তথ্য প্রাপ্তি> জেনারেল নির্বাচন করে তারপরে ফাইলের ধরনটি সোর্সকোড.সিপি.ওজেসিপি-তে পরিবর্তন করে একই ফাইলটিতে সি ++ এবং অবজেক্টিভ-সি মিশ্রণ করতে পারেন। দ্বিতীয় বিকল্পটি কার্যকর যদি আপনার কাছে একটি .cpp ফাইল থাকে যেখানে আপনি ম্যাক-নির্দিষ্ট #ifdef এর মধ্যে উদ্দেশ্য-সি ব্যবহার করতে চান।


1
বিটিডাব্লু, (সত্যিই দরকারী) সি ++ টেমপ্লেটটি এক্সকোড (4.x এবং 5.x) এর সাম্প্রতিক সংস্করণগুলি সহ গেছে
জে

1

যদিও এটি বহু বছরের পুরানো প্রশ্ন ...

আমি কয়েকটি কোকো ক্লাসের সি ++ র‌্যাপার তৈরি করার চেষ্টা করেছি ।

এটি বেশ চমৎকার অভিজ্ঞতা ছিল। সি ++ ওজেক্টিভ-সি এর চেয়ে ভাল ধরণের সুরক্ষা সরবরাহ করেছে এবং আমাকে কম কোড লিখতে বাধ্য করেছে। তবে সংকলনের সময় এবং মেমরির সুরক্ষা আরও খারাপ। এটি সম্ভব তবে কয়েকটি গতিশীল ভিত্তিক বৈশিষ্ট্যগুলি পরিচালনা করা সহজ ছিল না। আমি মনে করি এটি সি ++ এর সাথে ডিল করার কোনও মানে হয় না।

যাইহোক সুইফট ঘোষণার কারণে আমার প্রকল্পটি শেষ পর্যন্ত পরিত্যক্ত হয়েছিল। এটি প্রথমে আমি সি ++ ব্যবহার করতে চাইলে সমস্ত কারণ সাফ করেছে এবং আরও আরও ভাল সরবরাহ করে।


0

আপনি যদি খাঁটি গ্রাফিকাল অ্যাপ্লিকেশন লিখছেন, অর্থাৎ আপনি কোড ব্যবহার করে সবকিছু আঁকছেন , ওপেন ফ্রেমওয়ার্কগুলি বিবেচনা করুন । এটি সি / সি ++ এর শীর্ষে নির্মিত একটি ওপেনসোর্স গ্রাফিকাল প্রোগ্রামিং ভাষা। ইহা ছিল অ্যাডঅনস যা মানুষ ভাষা প্রসারিত করার অনুমতি দেয়। আইফোনটির জন্য তাদের একটি অ্যাডন রয়েছে । আমি বিশ্বাস করি যে এটি লাইব্রেরি এবং এক্সকোড প্রকল্পগুলির সাথে আসে যা আপনাকে আইফোন এবং আইপড স্পর্শের জন্য অ্যাপ্লিকেশন সংকলন করতে সহায়তা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.