2012-03-28 10 views
5

Gdzie mogę znaleźć konkretny dokument lub dokumentację DOSa i Donts na temat używania C++ z Objective-C?Mieszanie C++ i Objective C

Wygląda na to, że Apple usunął ten dokument ze swojej strony internetowej i jestem zaintrygowany zbieraniem informacji z blogów i pytań zamieszczonych tutaj.

Każdy może prowadzić o tym samym.

Kiedy używamy .mm plik, podczas mieszania składni lub podczas korzystania z obiektu w .m pliku który należy do klasy C++?

Podczas przekazywania obiektów między funkcjami należącymi do dwóch różnych języków, takich jak przekazywanie obiektu object-c do funkcji w pliku cpp, konieczne jest zebranie go w pustkę * lub czy mogę użyć (ObjectiveC inteface) *?

+0

Co masz na myśli przez "podczas używania obiektu w pliku .m należącego do klasy C++"? – pmdj

+0

@pmjordan: jeśli robię kompozycję obiektu C++ w interfejsie cel-c. #import "cplusplus.h” interfejs XYZ: NSObject { { Cplusplus * myObj; }} – tusharfloyd

Odpowiedz

6

Trzeba użyć Objective-C++, gdy jesteś albo #include/#import ing lub bezpośrednio pisząc zarówno Objective-C i C++ kod w tym samym pliku. Zazwyczaj jest to oczywiste dzięki wyraźnemu kodowi; #include s są często mniejsze i musisz uważać, aby uniknąć "przeciekania" jednego z języków do zbyt wielu innych. Twój przykład pliku nagłówkowego C++ jest jednoznaczny: możesz to zrobić tylko w Objective-C++. Zauważ, że jeśli twój Cplusplus był typem struct, możesz przekazać dalej - zadeklaruj go jako taki zamiast #import w nagłówku C++.

Jeśli zrobisz to w nagłówku, to "zatruje" nagłówek, aby działał tylko w tym trybie. Musisz aktywnie tego uniknąć, bo cały twój projekt wkrótce skończy się tylko plikami .mm. I have documented some techniques in this article i previously, in this earlier article. W nowszych wersjach Objective-C możesz dodawać znaki iv do klas w rozszerzeniach kategorii. Oznacza to, że możesz zdefiniować C++ - wpisane ivars w pliku .mm, , a nie w nagłówku, co pozwala na pliki .m do #import.

Na drugie pytanie (Proszę pytać tylko jedno pytanie na raz): typ id jest zdefiniowana w pliku nagłówkowym objc.h w kategoriach C i tym samym będą działać zarówno w Objective-C i C++. Podobnie, API środowiska wykonawczego Objective-C jest wyeksponowane pod względem funkcji C, które będą działać również z C++. Jeśli rzeczywiście chcesz wysyłać wiadomości i uzyskiwać dostęp do właściwości obiektów Objective-C z kanoniczną składnią kodu C++, musisz przełączyć ten plik na Objective-C++.

+0

zamiast #import jeśli zrobić @class (deklaracja przód), a następnie – tusharfloyd

+0

' @ class' przodu deklaruje klasy Cel-C (i jest nielegalne czysty C++). "class' forward deklaruje klasę C++, ale nie ma specjalnego znaczenia w Objective-C (możesz technicznie nazwać zmienną" class "). W C++, struktury i klasy są prawie dokładnie tym samym, a struktury są dziedziczone z C w Objective-C. Więc jeśli zdefiniujesz swoją klasę C++ jako 'struct', możesz * może * przekazać dalej-zadeklarować ją w nagłówku Objective-C. – pmdj

+0

Phil zaktualizował swój artykuł od tego posta, nowy jest tutaj : http://philjordan.eu/article/mixing-objective-c-c++-andobjective-c++ –

3

Użyj plików .mm, jeśli masz składnię C++ w swoim kodzie lub gdy zawierasz plik (y) zawierający kod C++.

Mieszanie C++ z celem-c może być nieco mylące, ale jeśli uważasz, że wskaźnik jest mądry, to nie jest wielka sprawa. Traktuj obiekty instancji C++ tak jak w C++ i to samo dotyczy obiektów c obiektów.