использовать c ++ с какао вместо objective-c?

<p>я хотел бы написать приложения, которые используют c++ и платформы cocoa, потому что apple не делает carbon 64-битным. c++ выглядит довольно ванильно в своей реализации в linux и windows, но в mac os x кажется, что требуются дополнительные apple специальные куски кода (например, оболочка obj-c). также кажется, что apple заставляет разработчиков писать на objective-c, а не на c++, хотя я могу ошибаться.</p><p>я пытаюсь найти путь для написания кода на mac, который легко поддерживать кроссплатформенным. необходимость писать код на c++ для linux/windows, а затем переписывать большие части в objective-c будет очень неэффективным.</p><p>есть ли способ написать код на c++, который будет поддерживаться в будущем и поддерживаться в xcode? кроме того, если это возможно, как бы я смешал c++ и objective-c в xcode? благодарю.</p>

<p>вы не можете написать приложение какао полностью на c++. какао в значительной степени опирается на возможности позднего связывания objective-c для многих своих основных технологий, таких как привязки значения ключа, делегаты (стиль какао) и шаблон целевого действия. поздние требования связывания делают <em> очень </em> сложным для реализации api какао в типизированном языке с привязкой ко времени компиляции, таком как c++ ⁱ. конечно, вы можете написать чистое приложение на c++, которое работает на os x. оно просто не может использовать api-интерфейсы какао.</p><p>итак, у вас есть два варианта, если вы хотите поделиться кодом между приложениями c++ на других платформах и вашим приложением на основе cocoa. во-первых, написать слой модели на c++ и gui в какао. это общий подход, используемый некоторыми очень большими приложениями, включая <a href="http://wolfram.com">mathematica</a> . ваш код c++ можно оставить без изменений (вам не нужны расширения "фанки" apple для написания или компиляции c++ в os x). ваш уровень контроллера, скорее всего, будет использовать objective-c++ (возможно, расширение "фанки" apple, на которое вы ссылаетесь). objective-c++ - это надмножество c++, точно так же, как objective-c - это надмножество c. в objective-c++ вы можете выполнять вызовы передачи сообщений в стиле objc (например, <code>[some-objc-object callmethod];</code>) изнутри функции c++. и наоборот, вы можете вызывать функции c++ из кода objc, например:</p><pre><code>@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 </code></pre><p>вы можете узнать больше о objective-c++ на языке objective-c <a href="http://developer.apple.com/documentation/cocoa/conceptual/objectivec/articles/chapter\_14\_section\_1.html#//apple\_ref/doc/uid/tp30001163-ch10-sw1">руководство</a> . в этом случае слой представления может быть чисто objective-c.</p><p>второй вариант - использовать кроссплатформенный инструментарий c++. инструментарий <a href="http://qt.nokia.com/">qt</a> может соответствовать всем требованиям. кроссплатформенные наборы инструментов, как правило, презираются пользователями mac, потому что они не совсем точно смотрят и чувствуют детали, а пользователи mac ожидают улучшения в пользовательском интерфейсе приложений mac. qt работает на удивление хорошо, однако, в зависимости от аудитории и использования вашего приложения, оно может быть достаточно хорошим. кроме того, вы потеряете некоторые из технологий, специфичных для os x, таких как core animation и некоторые функции quicktime, хотя в qt api есть приблизительные замены. как вы указали, carbon не будет перенесен на 64-битную версию. поскольку qt реализован на api-интерфейсах carbon, trolltech/nokia пришлось портировать qt на api-интерфейс cocoa, чтобы сделать его 64-битным совместимым. насколько я понимаю, следующий выпуск qt (в настоящее время в <a href="http://qt.nokia.com/about/news/qt-4.5-release-candidate-available">release candiate</a> ) завершает этот переход и является 64-битной совместимой на os x. возможно, вы захотите взглянуть на источник qt 4.5, если вы вы заинтересованы в интеграции c++ и api какао.</p><hr><p>\_ некоторое время apple делала api-интерфейс cocoa доступным для java, но мост требовал тщательной ручной настройки и был не в состоянии обрабатывать более продвинутые технологии, такие как привязки значения ключа, описанные выше. в настоящее время динамически типизированные языки с привязкой к среде выполнения, такие как python, ruby и т.д., являются единственным реальным вариантом для написания приложения какао без objective-c (хотя, конечно, эти мосты используют objective-c под капотом).</p>

<p>ну, это может звучать глупо, но на самом деле мы можем написать чистый код c++ для создания gui для mac os x, но мы должны ссылаться на инфраструктуру cocoa.</p><pre><code>/* * 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; } </code></pre>

<p>да, вы можете просто использовать c++ (т.е. записывать его в файлы * .cpp) и даже смешивать c++ и objective-c внутри файлов * .mm (стандартный код objective-c хранится в файлах * .m).</p><p>конечно, вам все равно придется использовать objective-c для вашего пользовательского интерфейса и создавать оболочки objective-c для ваших объектов c++. другой вариант - переключиться на <a href="https://www.qt.io">qt</a> , который представляет собой c++ framework, поддерживающий windows, mac os x и linux - и будет выпущен под lgpl со следующей версией 4.5.</p>

<p>да, вы можете смешать их.</p><p>вам необходимо использовать objective-c, чтобы напрямую работать с объектами gui и получать от них уведомления.</p><p>эти объекты objective-c могут напрямую вызывать логику c++, если вы помещаете их в файлы .mm вместо чистых файлов objective-c .m. обратите внимание, что вы можете увидеть (намного) более старый совет, предлагающий использовать заглавные буквы .m для обозначения objective-c++, но это очень странно и может запутать вас так же, как и компилятор.</p><p>вам не нужно оборачивать каждый объект c++, но ваш код objective-c должен содержать указатели на них.</p><p>apple больше не публикует образцы, показывающие, как это сделать.</p><p>есть отличное видео питера стейнбергера, размещенное в realm <a href="https://academy.realm.io/posts/altconf-peter-steinberger-objective-c++-what-could-possibly-go-wrong/">[objective] c++: что может быть неправильным?</a> я очень рекомендую всем, кто все еще использует objective-c++, и вы можете быстро просмотреть стенограмму.</p>

<p>если вы просто хотите использовать простой vanilla c++, это абсолютно поддерживается и на самом деле ничем не отличается от любой другой платформы. у xcode даже есть шаблон для этого в файл> новый проект> утилита командной строки> инструмент c++. кроме того, ряд популярных библиотек с открытым исходным кодом (libcurl, libxml2, sqlite и т.д.) поставляются с os x и доступны для динамического связывания. вам не нужно использовать какао или что-то специфичное для apple, если вы не хотите.</p><p>если вы хотите использовать какао в определенных частях вашего приложения, взгляните на <a href="http://developer.apple.com/documentation/cocoa/conceptual/objectivec/articles/chapter\_14\_section\_1.html">objective-c++</a> . вы можете смешивать c++ и objective-c в одном и том же файле, задав ему расширение .mm или щелкнув правой кнопкой мыши файл в xcode и выбрав "get info"> "general", а затем изменив "тип файла" на sourcecode.cpp.objcpp. второй вариант полезен, если у вас есть файл .cpp, где вы хотите использовать objective-c в специфичном для mac файле #ifdef.</p>

<p>хотя это вопрос лет ...</p><p>у меня есть <a href="https://github.com/eonil/cocoaplusplus">пытался сделать c++ обертку из некоторых классов какао</a> .</p><p>это был довольно хороший опыт. c++ обеспечил лучшую безопасность типов, чем objective-c, и заставил меня писать меньше кода. но время компиляции и безопасность памяти хуже. это возможно, но с некоторыми динамическими функциями было нелегко справиться. я думаю, что нет смысла иметь дело с этим на c++.</p><p>в любом случае, мой проект был окончательно заброшен из-за анонса swift. это очистило все причины, по которым я сначала хотел использовать c++, и предоставляет еще больше и лучше.</p>

<p>если вы пишете чисто графическое приложение, то есть вы рисуете все, используя код, рассмотрите <a href="http://www.openframeworks.cc/">openframeworks</a> . это графические языки программирования с открытым исходным кодом, построенные на основе c/c++. он имеет <a href="http://www.openframeworks.cc/addons">аддоны</a> , которые позволяют людям расширять язык. у них есть <a href="http://code.google.com/p/ofxiphone/">аддон для iphone</a> . я считаю, что он поставляется с библиотекой и проектами xcode, которые помогут вам скомпилировать приложения для iphone и ipod touch.</p>