Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1544 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

inclusion cyclique

n°1916798
Taz
bisounours-codeur
Posté le 19-08-2009 à 18:02:09  profilanswer
 

Reprise du message précédent :
Si c'est pas clair pour toi, regarde comment tu ferais tout en un seul fichier.

mood
Publicité
Posté le 19-08-2009 à 18:02:09  profilanswer
 

n°1916801
Glock 17Pr​o
Posté le 19-08-2009 à 18:02:46  profilanswer
 

OUI MAIs je me mange une erreur au linkage, si je définis mes fonctions dans un autre .h sans le lié au .h intégrant mes déclarations


Message édité par Glock 17Pro le 19-08-2009 à 18:13:13
n°1916806
Glock 17Pr​o
Posté le 19-08-2009 à 18:23:21  profilanswer
 

je pense avoir trouvé la feinte, utilser des fonctions non membre que je peux appeler dans la définition des fonctions template , et définir ces fonctions non membres dans un .cpp, .cpp qui include les .h qui vont bien

Message cité 2 fois
Message édité par Glock 17Pro le 19-08-2009 à 18:23:44
n°1916807
Glock 17Pr​o
Posté le 19-08-2009 à 18:25:04  profilanswer
 

putain erreur de link too, wtf !

n°1916816
sligor
Posté le 19-08-2009 à 18:52:41  profilanswer
 

Joel F a écrit :


 
Si :/
Les singletons c'ets bien pr brille en société, en vrai ca sert jamais à rien à part à te faire ecrire du code moche, monolothique, peu scindbale, qui fait que ton applic ompile en 10 siecles et qui pose des problemes d'ordres d'initialisations.
 
Bref le singleton, oublie quoi.


C'est toujours mieux qu'une variable globale [:ocolor]

n°1916820
Glock 17Pr​o
Posté le 19-08-2009 à 19:27:33  profilanswer
 

ça revient à peu prés  au même imo, le singleton c'est juste la version objet de la variable globale


Message édité par Glock 17Pro le 19-08-2009 à 19:32:07
n°1916822
Joel F
Real men use unique_ptr
Posté le 19-08-2009 à 19:52:54  profilanswer
 

sligor a écrit :


C'est toujours mieux qu'une variable globale [:ocolor]


 
Bah si c'est un static const global variable initialisé au point de def. c'ets moins la merde :o
De toute façon, le singleton n'est jamais une vrai solution.

n°1916833
Glock 17Pr​o
Posté le 19-08-2009 à 21:01:41  profilanswer
 

Glock 17Pro a écrit :

je pense avoir trouvé la feinte, utilser des fonctions non membre que je peux appeler dans la définition des fonctions template , et définir ces fonctions non membres dans un .cpp, .cpp qui include les .h qui vont bien


 
c'est normal que ça marche pas ça ? enfin que l'édition des liens coincent

n°1916834
sligor
Posté le 19-08-2009 à 21:05:11  profilanswer
 

donne les erreurs exactes, on est pas devin :o

n°1916835
Glock 17Pr​o
Posté le 19-08-2009 à 21:08:48  profilanswer
 

euh édition des liens qui coincent c'est un message d'erreur stantard, limite c'est ISO

mood
Publicité
Posté le 19-08-2009 à 21:08:48  profilanswer
 

n°1916836
sligor
Posté le 19-08-2009 à 21:10:49  profilanswer
 

ouai, mais ça dit ce qu'il manque ce qui est une information importante :o


Message édité par sligor le 19-08-2009 à 21:10:57
n°1916840
Glock 17Pr​o
Posté le 19-08-2009 à 22:01:40  profilanswer
 

c'est le message: unresolve external symbol maquillage@fonction@maquillage

n°1916841
sligor
Posté le 19-08-2009 à 22:10:08  profilanswer
 

si tu as cette erreur c'est que tu as déclarer cette fonction sans la définir nul part, tu sais ce qu'il te reste à faire [:spamafote]

n°1916844
Glock 17Pr​o
Posté le 19-08-2009 à 22:15:55  profilanswer
 

voilà donc merci d'essayer de m'aider mais j'ai un peu plus que le niveau débutant en C++, donc oui j'ai définit ma fonction, je post car c'est pas un problème trivial, la preuve soit on me réponds à côté , soit on me dit que je suis dans une impasse (ce qui est possible, mais je serais un peu déçu du C++ pour le coup)

n°1916847
sligor
Posté le 19-08-2009 à 22:28:37  profilanswer
 

Glock 17Pro a écrit :

c'est le message: unresolve external symbol maquillage@fonction@maquillage


ton linker ne fait pas le demangling ?

n°1916849
ptitchep
Posté le 19-08-2009 à 22:29:53  profilanswer
 

Si tu es dans une impasse (c'est possible, expérience vécue), c'est un problème de conception, pas de c++.
Si je comprends bien il ne trouve pas ta méthode parce que c'est template et défini dans un autre fichier que ton hpp qui contient la classe (là où tu a forward déclaré).
Essai d'inclure le fichier contenant cette méthode (oui le code) dans celui qui l'utilise, nomme le autrement que .cpp pour ça (autant prendre de bonnes habitudes). Si ça fonctionne, reviens ici pour demander une façon plus propre XD à Joel, Taz ou autre phénomène


---------------
deluser --remove-home ptitchep
n°1916855
sligor
Posté le 19-08-2009 à 23:02:01  profilanswer
 

La meilleure méthode et la plus évidente est de séparer (les déclarations) et (les définitions inline) dans des headers différents comme l'a dit Taz il me semble.


Message édité par sligor le 19-08-2009 à 23:02:23
n°1916984
Taz
bisounours-codeur
Posté le 20-08-2009 à 10:49:53  profilanswer
 

Glock 17Pro a écrit :

je pense avoir trouvé la feinte, utilser des fonctions non membre que je peux appeler dans la définition des fonctions template , et définir ces fonctions non membres dans un .cpp, .cpp qui include les .h qui vont bien


Y a pas de feinte, c'est exactement ce que je t'ai montré: séparer déclaration et définition.

n°1916993
Glock 17Pr​o
Posté le 20-08-2009 à 11:01:22  profilanswer
 

oui mais même en faisant ce distingo(un .h pour les définitions, un .h pour les déclarations), au final je dois inclure le fichier de déclaration à la fin du fichier de définition, je me retrouve donc à devoir faire des include "B.h" dans "A."h. Or il aurait fallut que dans A.h je n'ai qu'à faire class B;
 
C'est ce que j'ai essayé de faire en passant par des fonctions non membres qui contiennent le code utilisant réellement les objets de B.h. Ainsi dans la définitions des mes fonctions templates définit dans A.h (ou A_impl.h), j'appelle ces fonctions non membres qui sont quant à elles définit dans un autre fichier (.cpp) ; fichier qui fait un #include "B.h", mais ça provoque une erreur de link.
 
De plus je ne comprends toujours pas pourquoi avec mon architecture les #ifndef én début de fichier ne suffise pas, et me mène à ce genre de problème, mentalement je ne visualise pas un éventuel circuit d'include qui se ferait à l'infinie et provoquerait une erreur de compilation

Message cité 1 fois
Message édité par Glock 17Pro le 20-08-2009 à 11:05:36
n°1917006
sligor
Posté le 20-08-2009 à 11:21:50  profilanswer
 

A_decl.h:

Code :
  1. class B;
  2. class A{
  3. };


B_decl.h:

Code :
  1. class A;
  2. class B{
  3. ...
  4. };


A_Def.h:

Code :
  1. #include "A_decl.h"
  2. #include "B_decl.h"
  3. inline ### A::####()
  4. {
  5.   ...
  6. }
  7. ...
 

B_Def.h:

Code :
  1. #include "A_decl.h"
  2. #include "B_decl.h"
  3. inline ### B::####()
  4. {
  5.   ...
  6. }
  7. ...
 

main.cpp:

 
Code :
  1. #include "A_Def.h"
  2. #include "B_Def.h"
  3. int main()
  4. {
  5. A instance_A;
  6. B instance_B;
  7. ...
  8. }
 

:o

 

edit: ne pas oublier les gardes #ifndef #define #endif dans chaque header :o
edit2: merci aux experts de confirmer que je ne dis pas de conneries [:ocolor]


Message édité par sligor le 20-08-2009 à 11:44:14
n°1917076
Taz
bisounours-codeur
Posté le 20-08-2009 à 14:34:51  profilanswer
 

Glock 17Pro a écrit :

oui mais même en faisant ce distingo(un .h pour les définitions, un .h pour les déclarations), au final je dois inclure le fichier de déclaration à la fin du fichier de définition, je me retrouve donc à devoir faire des include "B.h" dans "A."h. Or il aurait fallut que dans A.h je n'ai qu'à faire class B;
 
C'est ce que j'ai essayé de faire en passant par des fonctions non membres qui contiennent le code utilisant réellement les objets de B.h. Ainsi dans la définitions des mes fonctions templates définit dans A.h (ou A_impl.h), j'appelle ces fonctions non membres qui sont quant à elles définit dans un autre fichier (.cpp) ; fichier qui fait un #include "B.h", mais ça provoque une erreur de link.
 
De plus je ne comprends toujours pas pourquoi avec mon architecture les #ifndef én début de fichier ne suffise pas, et me mène à ce genre de problème, mentalement je ne visualise pas un éventuel circuit d'include qui se ferait à l'infinie et provoquerait une erreur de compilation


 
Joue avec "g++ -E" et tu verras bien quand ça a un sens ou pas.

n°1917081
Glock 17Pr​o
Posté le 20-08-2009 à 14:42:39  profilanswer
 

je suis sous windows avec visual

n°1917113
Joel F
Real men use unique_ptr
Posté le 20-08-2009 à 15:48:08  profilanswer
 

\P :o

n°1917129
Taz
bisounours-codeur
Posté le 20-08-2009 à 16:15:56  profilanswer
 

Et PI, y a absolument rien d'anormal à faire un .hpp et un .tpp, le .hpp incluant le .tpp en fin de fichier.

n°1917176
Glock 17Pr​o
Posté le 20-08-2009 à 20:56:20  profilanswer
 

je dis pas le contraire, je dis juste que ça résoud pas le pbm puisqu'au final, cela impose de faire include, sligor propose l'inverse de faire l'include du .hpp dans le .tpp et non l'inverse, peut être que c'est ça la solution jss un peu perdu au final

n°1917177
sligor
Posté le 20-08-2009 à 21:11:38  profilanswer
 

la deux solution solution son identique au final dans le main.cpp il y a d'abord déclaration et enfin définition. Si le linker gueule c'est qu'il manque une définition dans la chaine d'include dans le main.cpp final d'ou l'utilité de l'option \P ou gcc -E

n°1917178
Glock 17Pr​o
Posté le 20-08-2009 à 21:21:09  profilanswer
 

je sais pas c space je vois pas pourquoi ça marche pas, et j'ai pas le temps au taff de m'attarder sur ce truc, frustrant...


Message édité par Glock 17Pro le 20-08-2009 à 21:28:28
n°1917266
Tarabiscot​e
Posté le 21-08-2009 à 08:49:38  profilanswer
 

La solution de sligor devrait marcher mais sinon il y a une autre solution :
déclaration
inclusion
définition
 
Le but c'est de faire les déclarations avant de charger les fichiers suivant, à la fin on remontera récursivement dans les fichiers pour terminer avec les définitions.
 
Mettre les includes avant les déclarations ça sert quand on veut faire des compositions.

n°1917333
Taz
bisounours-codeur
Posté le 21-08-2009 à 13:47:53  profilanswer
 

Tarabiscote a écrit :

La solution de sligor devrait marcher mais sinon il y a une autre solution :
déclaration
inclusion
définition


C'est tout juste le code que j'ai posté.

n°1917351
Tarabiscot​e
Posté le 21-08-2009 à 15:15:19  profilanswer
 

:jap:  
En effet je viens de relire tes messages.
Mais je n'avais pas vu initialement que tu avais écrit directement dans le "quotemsg".
 :jap:

n°1917555
sligor
Posté le 22-08-2009 à 15:12:33  profilanswer
 

Il y a un truc que je comprends pas, en général les erreur de link sont assez explicites, ce qui n'a pas l'air d'être la cas chez toi  :??:  
 
example ici j'ai oublié de définir print(int) qui est appelé à la ligne 9 dans la fonction operator<<(T&, int):

/tmp/cc-YtftIA.o: In function `operator<<(T&, int)':
/home/sligor/test.cpp:9: undefined reference to `print(int)'


 


Message édité par sligor le 22-08-2009 à 15:14:10
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Problème d'inclusion de psapi.h dans une bibliothèqueInclusion page externe
recherche algo pour optimiser une recherche dans un graphe cycliqueInclusion de resources C/C++
NEED HELP un débutant C# inclusion de classesupprimer un bout de code lors d'une inclusion
Inclusion d'un header automatiqueinclusion multiple
Problème d'inclusion de bibliothèqueinclusion de fichiers de classe ayant le meme nom
Plus de sujets relatifs à : inclusion cyclique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR