Вы не можете полностью написать приложение Какао на 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 под капотом).