Nie można napisać aplikacji Cocoa w całości w języku C ++. Cocoa w dużym stopniu opiera się na późnych możliwościach wiązania Objective-C w przypadku wielu podstawowych technologii, takich jak powiązania klucz-wartość, delegaci (styl kakaowy) i wzorzec działania docelowego. Wymagania dotyczące późnego wiązania bardzo utrudniają implementację interfejsu API Cocoa w języku typizowanym związanym z czasem kompilacji, takim jak C ++ ⁱ. Możesz oczywiście napisać aplikację w czystym języku C ++ działającą na systemie OS X. Po prostu nie może ona korzystać z API Cocoa.
Masz więc dwie opcje, jeśli chcesz udostępniać kod między aplikacjami C ++ na innych platformach i aplikacją opartą na kakao. Pierwszym jest napisanie warstwy modelu w C ++ i GUI w Cocoa. Jest to typowe podejście stosowane przez niektóre bardzo duże aplikacje, w tym Mathematica . Twój kod C ++ może pozostać niezmieniony (nie potrzebujesz "funky" rozszerzeń Apple, aby pisać lub kompilować C ++ na OS X). Twoja warstwa kontrolera prawdopodobnie będzie korzystać z Objective-C ++ (być może "funky" rozszerzenia Apple, o którym mówisz). Objective-C ++ jest nadzbiorem C ++, tak jak Objective-C jest nadzbiorem C. W Objective-C ++, można tworzyć komunikaty w stylu objc, przekazujące wywołania (na przykład [some-objc-object callMethod];
) z poziomu funkcji C ++. I odwrotnie, możesz wywoływać funkcje C ++ z poziomu kodu ObjC, na przykład:
@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
Możesz dowiedzieć się więcej o Objective-C ++ w przewodniku po języku Objective-C . Warstwa widoku może wtedy być czystą Objective-C.
Drugą opcją jest użycie wieloplatformowego zestawu narzędzi C ++. Plik Qtzestaw narzędzi może pasować do rachunku. Wieloplatformowe zestawy narzędzi są generalnie pogardzane przez użytkowników komputerów Mac, ponieważ nie zapewniają one wszystkich szczegółów wyglądu i dotyku, a użytkownicy komputerów Mac oczekują dopracowania w interfejsie aplikacji na komputery Mac. Qt wykonuje jednak zaskakująco dobrą robotę i w zależności od odbiorców i sposobu użytkowania aplikacji może być wystarczająco dobry. Ponadto stracisz na niektórych technologiach specyficznych dla OS X, takich jak Core Animation i niektóre funkcje QuickTime, chociaż istnieją przybliżone zamienniki w Qt API. Jak zauważyłeś, Carbon nie zostanie przeniesiony do wersji 64-bitowej. Ponieważ Qt jest zaimplementowany w Carbon API, Trolltech / Nokia musiało przenieść Qt do Cocoa API, aby było kompatybilne z 64-bitowym. Rozumiem, że następne wydanie Qt (obecnie kandydat do wydania) kończy to przejście i jest kompatybilny z 64-bitowym systemem OS X. Możesz rzucić okiem na źródło Qt 4.5, jeśli jesteś zainteresowany integracją C ++ i API Cocoa.
ⁱ Przez jakiś czas Apple udostępniło API Cocoa dla Javy, ale most wymagał obszernego dostrajania ręcznego i nie był w stanie obsłużyć bardziej zaawansowanych technologii, takich jak opisane powyżej wiązania klucz-wartość. Obecnie dynamicznie wpisywane języki związane ze środowiskiem uruchomieniowym, takie jak Python, Ruby itp., Są jedyną realną opcją pisania aplikacji Cocoa bez Objective-C (chociaż oczywiście te mosty używają Objective-C pod maską).
Cóż, może to zabrzmieć głupio, ale tak naprawdę możemy napisać czysty kod C ++, aby stworzyć GUI dla Mac OS X, ale musimy połączyć się z frameworkiem Cocoa.
źródło
objc_getClass
z(id)objc_getClass
Tak, możesz po prostu użyć C ++ (tj. Zapisać go w plikach * .cpp), a nawet mieszać C ++ i Objective-C w plikach * .mm (standardowy kod Objective-C jest przechowywany w plikach * .m).
Oczywiście nadal musisz używać Objective-C jako interfejsu użytkownika i tworzyć opakowania Objective-C dla swoich obiektów C ++. Inną opcją jest przejście na Qt, który jest platformą C ++, która obsługuje systemy Windows, Mac OS X i Linux - i zostanie wydana na licencji LGPL wraz z następną wersją 4.5.
źródło
Tak, możesz je mieszać.
Musisz użyć Objective-C, aby bezpośrednio operować na obiektach GUI i otrzymywać od nich powiadomienia.
Te obiekty Objective-C mogą bezpośrednio wywoływać logikę C ++, jeśli umieścisz je w plikach .mm, zamiast czystych plików .m Objective-C. Zauważ, że możesz zobaczyć (dużo) starsze porady sugerujące użycie dużych liter .M do wskazania Objective-C ++, ale jest to bardzo niestabilne i może zmylić Ciebie i kompilator.
Nie musisz zawijać każdego obiektu C ++, ale Twój kod Objective-C będzie musiał zawierać wskaźniki do nich.
Apple nie publikuje już żadnych próbek pokazujących, jak to zrobić.
W Realm [Objective] C ++: What Could Possably Go Wrong? Gorąco polecam każdemu, kto nadal używa Objective-C ++ i możesz szybko przejrzeć transkrypcję.
źródło
Jeśli chcesz używać zwykłego, waniliowego C ++, jest to absolutnie obsługiwane i nie różni się niczym od innych platform. Xcode ma nawet szablon dla niego w menu Plik> Nowy projekt> Narzędzie wiersza poleceń> Narzędzie C ++. Ponadto wiele popularnych bibliotek open source (libcurl, libxml2, sqlite itp.) Jest dostarczanych z systemem OS X i jest dostępnych do dynamicznego łączenia. Nie musisz używać kakao ani niczego specyficznego dla Apple, jeśli nie chcesz.
Jeśli chcesz używać Cocoa w niektórych częściach swojej aplikacji, spójrz na Objective-C ++ . Możesz mieszać C ++ i Objective-C w tym samym pliku, nadając mu rozszerzenie .mm lub klikając prawym przyciskiem myszy plik w Xcode i wybierając Uzyskaj informacje> Ogólne, a następnie zmieniając typ pliku na sourcecode.cpp.objcpp. Druga opcja jest przydatna, jeśli masz plik .cpp, w którym chcesz użyć Objective-C w #ifdef specyficznym dla Maca.
źródło
Chociaż to jest pytanie od lat ...
Ja postarałem się zrobić c ++ wrapper niektórych klas kakao .
To było całkiem miłe doświadczenie. C ++ zapewnia lepsze bezpieczeństwo typów niż Objective-C i zmusza mnie do pisania mniej kodu. Ale czas kompilacji i bezpieczeństwo pamięci są gorsze. Jest to możliwe, ale niektóre funkcje oparte na dynamice nie były łatwe w obsłudze. Myślę, że nie ma sensu zajmować się tym w C ++.
W każdym razie mój projekt został ostatecznie porzucony z powodu ogłoszenia Swift. Wyjaśniło wszystkie powody, dla których chciałem na początku używać C ++ i zapewnia jeszcze więcej i lepiej.
źródło
Jeśli piszesz czysto graficzną aplikację, tzn . Rysujesz wszystko za pomocą kodu, rozważ openFrameworks . Jest to graficzny język programowania typu open source oparty na C / C ++. Posiada dodatki, które pozwalają ludziom na rozszerzenie języka. Mają dodatek do iPhone'a . Wierzę, że jest dostarczany z biblioteką i projektami XCode, które pomogą Ci skompilować aplikacje na iPhone'a i iPoda touch.
źródło