Bonjour,
Adepte du Java depuis déjà quelques années, je me suis remis au C++ récement pour ne pas perdre la main. Et c'est dur.
Je me demandais comment faire quand deux classes appellent chacune un traitement de l'autre, lequel traitement est une fonction inline.
Prenons la situation suivante.
J'ai deux classes, appellons les A et B.
Chacune de ces classes dispose d'une méthode qui reçoit un objet de l'autre classe en argument, et utilise une autre méthode de cette dernière.
Ca donne:
Jusqu'ici, pas de problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 class B; class A { public: // Méthode de A utilisant B::traitementB void traitementAUtilisantB(B objetB); // Méthode de A utilisée par B::traitementBUtilisantA void traitementA(void); // Diverses autres méthodes et attributs } class B { public: // Méthode de B utilisant A::traitementA void traitementBUtilisantA(A objetA); // Méthode de B utilisée par A::traitementAUtilisantB void traitementB(void); // Diverses autres méthodes et attributs }
Mais ça se complique énormément si je décide que ces quatres méthodes (A::traitementA, B::traitementB, A::traitementAUtilisantB et B::traitementBUtilisantA) doivent être des fonctions inline.
En effet, comme le compilateur remplace une fonction inline par son code partout où c'est possible, une fonction inline doit être déclarée et définie au même endroit. Sauf erreur, pas question donc de placer leur code dans un fichier cpp après avoir déclaré ces deux classes. Il faut que le code des fonctions se trouve dans la déclaration de la classe.
Or, A::traitementAUtilisantB fait appel à B::traitementB. Il faut donc que la déclaration de B::traitementB soit avant la définition de A::traitementAUtilisantB. Et donc s'agissant de fonctions inline et d'après ce qui précède, que la définition (et pas simplement la déclaration) de la classe B se trouve avant celle de la classe A.
Mais ce qui est vrai pour A::traitementAUtilisantB et B::traitementB l'est aussi pour B::traitementBUtilisantA et A::traitementA. Et donc A doit être avant B.
On a donc A doit être avant B et B doit être avant A. Ce qui est impossible.
Ma question est : ai-je commis une erreur où suis-je tombé sur une limitation du C++? Dans le second cas, comment la contourner (autrement quand laissant tomber les inline) ?
Pour information, je suis tombé sur ce cas de figure en essayant de créer deux classes Application et InputController. Et je sais que l'utilité d'inline est limité, mais il ne fallait pas me donner quelque chose et s'attendre à ce que je n'essaie pas de jouer avec...
Merci d'avance.
Partager