2012-03-28 12 views
5

Dove posso trovare un documento concreto o una documentazione dos e donts sull'uso di C++ con Objective-C?Mixing C++ e Objective C

Apple sembra aver rimosso quel documento dal loro sito Web e sono del tutto confuso con la raccolta di frammenti di informazioni da blog e domande postate qui.

Chiunque può guidare lo stesso.

Quando usiamo il file .mm, mescolando di sintassi o durante l'utilizzo di un oggetto nel file di .m, che appartiene a una classe C++?

Mentre si passano oggetti tra funzioni appartenenti a due linguaggi diversi, come il passaggio di oggetto obiettivo-c a una funzione nel file cpp, è necessario raccoglierlo in void * o posso usare (ObjectiveC inteface) *?

+0

Cosa intendi con "durante l'utilizzo di un oggetto nel file .m che appartiene a una classe C++"? – pmdj

+0

@pmjordan: se sto facendo una composizione di oggetti C++ nell'interfaccia obiettivo-c. #import "cplusplus.h" interfaccia xyz: NSObject {{ Cplusplus * myobj; }} – tusharfloyd

risposta

6

è necessario utilizzare Objective-C++ ogni volta che si sono o #include/#import ing o direttamente scrivendo sia Objective-C e il codice C++ nello stesso file. Di solito è ovvio con codice esplicito; i #include sono spesso meno così, e bisogna stare attenti ad evitare di "far fuoriuscire" una delle lingue in troppa delle altre. Il tuo esempio di #import in un file di intestazione C++ è chiaro: puoi farlo solo con Objective-C++. Si noti che se il proprio Cplusplus era un tipo struct, è possibile inoltrarlo-dichiararlo come tale anziché #import in un'intestazione C++.

Se si esegue questa operazione in un'intestazione, "avvelena" l'intestazione per funzionare solo in tale modalità. Dovrai evitarlo attivamente, o il tuo intero progetto finirà presto con solo file .mm. I have documented some techniques in this article e previously, in this earlier article. Per le versioni più recenti di Objective-C, puoi anche aggiungere ivars alle classi nelle estensioni di categoria. Ciò significa che è possibile definire gli ivars tipizzati in C++ nel file .mm, non nell'intestazione, che consente i file .m a #import.

riguarda la seconda domanda (chiedere prega di una sola domanda alla volta): il tipo id è definito nel file di intestazione objc.h in termini di C e, quindi, lavoreranno sia in Objective-C e C++. Allo stesso modo, l'API runtime Objective-C è esposta in termini di funzioni C, che funzionerà anche da C++. Se in realtà si desidera inviare messaggi e accedere alle proprietà sugli oggetti Objective-C con la sintassi canonica del codice C++, sarà necessario passare tale file a Objective-C++.

+0

invece di #import se faccio @class (dichiarazione anticipata) poi – tusharfloyd

+0

' @ avanti class' dichiara una classe Objective-C (ed è illegale in puro C++). 'class' forward dichiara una classe C++ ma non ha alcun significato speciale in Objective-C (si può tecnicamente denominare una variabile" class "). In C++, le strutture e le classi sono quasi esattamente la stessa cosa e le strutture sono ereditate da C in Objective-C. Quindi, se si definisce la classe C++ come 'struct', si * può * inoltrarla in un'intestazione Objective-C. – pmdj

+0

Phil ha aggiornato il suo articolo da questo post, il nuovo è qui : http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++ –

3

Utilizzare i file .mm quando si ha una sintassi C++ nel codice o quando si includono file che contengono codice C++.

Il missaggio del C++ con l'obiettivo-c può essere un po 'confuso, ma se si pensa al puntatore-saggio di quanto non sia un grosso problema. Tratta i metodi di istanza dell'oggetto C++ come faresti in C++ e lo stesso vale per gli oggetti obiettivo c.