Вы не можете полностью написать приложение Какао на C ++. Какао в значительной степени полагается на возможности позднего связывания Objective-C для многих своих основных технологий, таких как привязки значения ключа, делегаты (стиль какао) и шаблон целевого действия. Требования позднего связывания очень затрудняют реализацию Cocoa API на типизированном языке с привязкой ко времени компиляции, например C ++ ⁱ. Вы, конечно, можете написать приложение на чистом C ++, работающее на OS X. Оно просто не может использовать API Какао.
Итак, у вас есть два варианта, если вы хотите поделиться кодом между приложениями C ++ на других платформах и вашим приложением на основе Какао. Первый - написать уровень модели на C ++ и графический интерфейс в Какао. Это общий подход, используемый некоторыми очень большими приложениями, включая Mathematica . Ваш код C ++ можно оставить без изменений (вам не нужны «фанковые» расширения Apple для написания или компиляции C ++ в OS X). Уровень вашего контроллера, скорее всего, будет использовать Objective-C ++ (возможно, «фанковое» расширение Apple, о котором вы говорите). Objective-C ++ - это надмножество C ++, точно так же, как Objective-C - надмножество C. В Objective-C ++ вы можете выполнять вызовы передачи сообщений в стиле objc (например, [some-objc-object callMethod];
) из функции C ++. И наоборот, вы можете вызывать функции 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 . Тогда слой представления может быть чистым Objective-C.
Второй вариант - использовать кросс-платформенный инструментарий C ++. Qtнабор инструментов может соответствовать всем требованиям. Кросс-платформенные инструменты обычно презираются пользователями Mac, потому что они не получают все детали внешнего вида в точности, а пользователи Mac ожидают совершенства в пользовательском интерфейсе приложений Mac. Однако Qt работает на удивление хорошо, и в зависимости от аудитории и использования вашего приложения может быть достаточно хорошим. Вдобавок вы потеряете некоторые специфические для OS X технологии, такие как Core Animation и некоторые функции QuickTime, хотя в Qt API есть приблизительные замены. Как вы указываете, Carbon не будет перенесен на 64-разрядную версию. Поскольку Qt реализован на Carbon API, Trolltech / Nokia пришлось перенести Qt на Cocoa API, чтобы сделать его 64-битным. Насколько я понимаю, следующая версия Qt (в настоящее время в выпуске кандидат) завершает этот переход и является 64-битной совместимой с OS X. Возможно, вы захотите взглянуть на исходный код Qt 4.5, если вы заинтересованы в интеграции C ++ и API Cocoa.
ⁱ Некоторое время Apple сделала Cocoa API доступным для Java, но мост требовал обширной ручной настройки и был неспособен обрабатывать более продвинутые технологии, такие как привязки значений ключей, описанные выше. В настоящее время динамически типизированные языки с привязкой к среде выполнения, такие как Python, Ruby и т. Д., Являются единственным реальным вариантом для написания приложения Какао без Objective-C (хотя, конечно, эти мосты используют Objective-C под капотом).
Что ж, это может показаться глупым, но на самом деле мы можем написать чистый код C ++ для создания графического интерфейса для Mac OS X, но мы должны связать его с фреймворком Cocoa.
источник
objc_getClass
на(id)objc_getClass
Да, вы можете просто использовать C ++ (т.е. записывать его в файлы * .cpp) и даже смешивать C ++ и Objective-C внутри файлов * .mm (стандартный код Objective-C хранится в файлах * .m).
Конечно, вам все равно придется использовать Objective-C для своего пользовательского интерфейса и создавать оболочки Objective-C для ваших объектов C ++. Другой вариант - перейти на Qt, который представляет собой C ++ Framework, поддерживающий Windows, Mac OS X и Linux, и будет выпущен под LGPL со следующей версией 4.5.
источник
Да, вы можете их смешивать.
Вам необходимо использовать Objective-C, чтобы напрямую работать с объектами графического интерфейса и получать от них уведомления.
Эти объекты Objective-C могут напрямую вызывать логику C ++, если вы помещаете их в файлы .mm вместо чистых файлов .m Objective-C. Обратите внимание, что вы можете увидеть (гораздо) более старые советы, предлагающие использовать верхний регистр .M для обозначения Objective-C ++, но это очень нестабильно и может запутать вас, а также компилятор.
Вам не нужно оборачивать каждый объект C ++, но ваш код Objective-C должен содержать указатели на них.
Apple больше не публикует образцы, показывающие, как это сделать.
Есть отличное видео Питера Штайнбергера, размещенное на Realm [Objective] C ++: Что могло пойти не так? Я настоятельно рекомендую всем, кто все еще использует Objective-C ++, и вы можете быстро просмотреть стенограмму.
источник
Если вы просто хотите использовать простой ванильный C ++, он абсолютно поддерживается и ничем не отличается от любой другой платформы. В Xcode даже есть шаблон для этого в меню «Файл»> «Новый проект»> «Утилита командной строки»> «Инструмент C ++». Кроме того, ряд популярных библиотек с открытым исходным кодом (libcurl, libxml2, sqlite и т.д.) поставляется с OS X и доступен для динамической компоновки. Вам не обязательно использовать Какао или что-то специфическое для Apple, если вы этого не хотите.
Если вы действительно хотите использовать Какао в определенных частях вашего приложения, взгляните на Objective-C ++ . Вы можете смешивать C ++ и Objective-C в одном файле, задав ему расширение .mm или щелкнув правой кнопкой мыши файл в Xcode и выбрав Get Info> General, а затем изменив тип файла на sourcecode.cpp.objcpp. Второй вариант полезен, если у вас есть файл .cpp, в котором вы хотите использовать Objective-C в рамках специфичного для Mac #ifdef.
источник
Хотя это многолетний вопрос ...
Я попытался сделать C ++ оболочку некоторых классов Какао .
Это был довольно приятный опыт. C ++ обеспечил лучшую безопасность типов, чем Objective-C, и заставил меня писать меньше кода. Но время компиляции и безопасность памяти хуже. Это возможно, но с некоторыми динамическими функциями было нелегко справиться. Думаю, на C ++ нет смысла заниматься этим.
В любом случае мой проект был окончательно заброшен из-за анонса Swift. Он устранил все причины, по которым я хотел сначала использовать C ++, и предоставляет еще больше и лучше.
источник
Если вы пишете чисто графическое приложение, т. Е. Все рисуете с помощью кода, рассмотрите openFrameworks . Это графический язык программирования с открытым исходным кодом, созданный на основе C / C ++. У него есть надстройки, которые позволяют людям расширять язык. У них есть аддон для iphone . Я считаю, что он поставляется с библиотекой и проектами XCode, которые помогут вам компилировать приложения для iPhone и iPod touch.
источник