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