[Résolu] Objective-C++: problèmes d'includes
Hello,
Le sujet a déjà été abordé, mais j'ai toujours des problèmes... d'où ma demande d'aide. :P
Je souhaite utiliser sur un projet iPhone plusieurs classes écrites en C++, qui sont utilisées par quelques classes Objective-C, de la sorte:
Mes classes C++ sont "entourées" de #ifndef/#define avant les #include et mes classes Annotation et Point sont enregistrées en ".mm".
Sauf que lorsque j'essaie d'utiliser ces classes C++ dans dans les classes Objective-C++, je me retrouve avec des erreurs "Expected specifier-qualifier-list before 'Vector3'" sur les variables de type Vector3, et des erreurs "Expected '=', '.', ..., before 'Vector3'" dans mon Vector3D.h.
J'ai beau essayer dans tous les sens de résoudre ce problème, impossible! Ce que j'essaie est-il vraiment possible?? Y a-t-il une manière claire d'éviter ces problèmes de link ?
Le sujet a déjà été abordé, mais j'ai toujours des problèmes... d'où ma demande d'aide. :P
Je souhaite utiliser sur un projet iPhone plusieurs classes écrites en C++, qui sont utilisées par quelques classes Objective-C, de la sorte:
- Vector2D [C++]
- Vector3D [C++] => #include Vector2D
- Projection [C++] => #include Vector2D + Vector3D
- Annotation [Objective-C++] : une des variables d'instance est un Vector3D
- Point [Objective-C++] : une des variables d'instance est un Vector3D
Mes classes C++ sont "entourées" de #ifndef/#define avant les #include et mes classes Annotation et Point sont enregistrées en ".mm".
Sauf que lorsque j'essaie d'utiliser ces classes C++ dans dans les classes Objective-C++, je me retrouve avec des erreurs "Expected specifier-qualifier-list before 'Vector3'" sur les variables de type Vector3, et des erreurs "Expected '=', '.', ..., before 'Vector3'" dans mon Vector3D.h.
J'ai beau essayer dans tous les sens de résoudre ce problème, impossible! Ce que j'essaie est-il vraiment possible?? Y a-t-il une manière claire d'éviter ces problèmes de link ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Merci, mais...
Cela dit, je m'oriente plutôt vers une solution " intermédiaire ": définir des classes " wrapper " pour mes Vector sous forme de classes Objective-C++, contenant elles-mêmes des instances ainsi que des méthodes vers les classes C++. Ainsi mes classes Annotation et Point ne traitent qu'avec de l'Objective-C.
Par contre je connais peu C++ et n'ai jamais mélangé ainsi les deux langages, je nage donc un peu, ne sachant pas vraiment quelles sont les bonnes pratiques, notamment au niveau des #include ou de la séparation des classes.
Ce n'est pas un problème de link c'est juste que le compilateur pense parser de l'objC alors que c'est de l'objc++
En gros la règle pour ne pas te prendre la tête si tu mixe du c++ avec de l'objective C: utilise toujours comme extension .mm
Le fait d'encapsuler une classe Vector C++ dans une classe VectorWrapper Objective-C++ (.mm) devrait donc me permettre de bien garder cette séparation, non? Cela rajoute une couche intermédiaire, mais évite aux classes Objective-C d'avoir connaissance du traitement C++-
J'ai tout essayé, pointeur ou pas, même résultat.
Mais finalement là je crois que je m'en sors en faisant de la sorte: ma classe Vector.mm contient les coordonnées x, y et z, qui sont accessibles en tant que propriétés, et dispose de méthodes "encapsulant" les méthodes C++. Exemple: une méthode d'addition de vecteur, qui utilisera les classes C++ nécessaires (d'après les x, y, z) afin de faire l'addition.
Donc je pense avoir une solution à mon problème, même si je n'ai pas forcément compris ce qui ne marchait pas dans ma version initiale :-\\
Si tu veux wrapper et caché ton implémentation c++ alors utilise des void* coté header et des casts a outrance dans ton .mm
exemple:
VectorWrapper.h
VectorWrapper.mm
voilou, pour ma pars je fais plutôt l'inverse l'ensemble de mon code est en C++ et la gui en objc/Cocoa sous mac et C#/.NET sous Windows
J'ai finalement obtenu ce que je voulais, sans utiliser de wrapper. J'ai tout repris un à un, et du coup il est difficile de dire ce qui ne fonctionnait pas auparavant...
Si cela peut aider quelqu'un d'autre, voici ce que j'ai fait (je ne dis pas que c'est le mieux à faire):
(*) Mes classes C++ (Vector) sont donc en C++ "pur", dont les header (.h) sont "entourés" des #defines suivant:
(*)Mes classes Objective-C++ (Annotation,...), de type .mm, possèdent plusieurs variables d'instances, dont certaines de type Vector (C++), déclarées en tant que pointeurs (avec un #import "Vector.h").
(*)Une classe utilisant un objet Objective-C++ est donc également en Objective-C++.