Cocoa アプリケーション全体を C++ で作成することはできません。Cocoa は、キーと値のバインディング、デリゲート (Cocoa スタイル)、ターゲット アクション パターンなどのコア テクノロジの多くについて、Objective-C のレイト バインディング機能に大きく依存しています。遅延バインディング要件により、C++ⁱ のようなコンパイル時にバインドされた型付き言語で Cocoa API を実装することは非常に困難になります。もちろん、OS X で実行される純粋な C++ アプリを作成することもできます。ただし、Cocoa API を使用することはできません。
したがって、他のプラットフォームの C++ アプリと Cocoa ベースのアプリケーションの間でコードを共有する場合は、2 つのオプションがあります。1 つ目は、モデル層を C++ で記述し、GUI を Cocoa で記述することです。これは、 Mathematicaなどの一部の非常に大規模なアプリで使用される一般的なアプローチです。C++ コードは変更せずにそのままにしておくことができます (OS X で C++ を作成またはコンパイルするために、「ファンキーな」Apple 拡張機能は必要ありません)。あなたのコントローラーレイヤーはおそらくObjective-C++を利用するでしょう(おそらくあなたが言及している「ファンキーな」Apple拡張機能)。Objective-C++ は、Objective-C が C のスーパーセットであるように、C++ のスーパーセットです。Objective- [some-objc-object callMethod];
C++ では、C++ 関数内から objc スタイルのメッセージ パッシング呼び出し ( など) を作成できます。逆に、次のように ObjC コード内から C++ 関数を呼び出すことができます。
@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 にすることができます。
2 番目のオプションは、クロスプラットフォームの C++ ツールキットを使用することです。Qt _ツールキットは法案に合うかもしれません。クロスプラットフォーム ツールキットは一般的に Mac ユーザーに軽蔑されます。なぜなら、彼らはすべてのルック アンド フィールの詳細を正確に把握できず、Mac ユーザーは Mac アプリケーションの UI に洗練されたものを期待するからです。ただし、Qt は驚くほど優れた機能を発揮します。対象ユーザーやアプリの使用状況によっては、Qt で十分な場合もあります。さらに、コア アニメーションや一部の QuickTime 機能など、OS X 固有のテクノロジの一部を利用できなくなりますが、Qt API にはおおよその代替品があります。ご指摘のとおり、Carbon は 64 ビットに移植されません。Qt は Carbon API に実装されているため、Trolltech/Nokia は Qt を Cocoa API に移植して 64 ビット互換にする必要がありました。私の理解では、Qt の次のリリース (現在リリース候補)) はこの移行を完了し、OS X で 64 ビット互換です。C++ と Cocoa API の統合に興味がある場合は、Qt 4.5 のソースを確認することをお勧めします。
ⁱ しばらくの間、Apple は Cocoa API を Java で利用できるようにしましたが、ブリッジには大規模な手動調整が必要であり、上記のキーと値のバインドなどのより高度なテクノロジを処理できませんでした。現在、Python、Ruby などの動的に型付けされ、ランタイムにバインドされた言語は、Objective-C を使用せずに Cocoa アプリを作成するための唯一の現実的なオプションです (もちろん、これらのブリッジは内部で Objective-C を使用しています)。