Salut, tu as 2 solutions:
1) Faire un include du A.cpp, plutôt dans le main(après include B.h)
2) Ajouter A.cpp à ton projet, ce qui est sans doute la meilleure solution, l'autre n'étant généralement que temporaire.
Version imprimable
Salut, tu as 2 solutions:
1) Faire un include du A.cpp, plutôt dans le main(après include B.h)
2) Ajouter A.cpp à ton projet, ce qui est sans doute la meilleure solution, l'autre n'étant généralement que temporaire.
La je suis perdu.
Peut tu faire un petit code avec ton problème??
As tu un .pro correct et essayé de faire qmake, puis make??
euh... tout d'abord je précise que c'est du C++ normal, pas de Qt nécessaire ici.
Ensuite, mettre le .cpp dans le main me paraît ridicule...le code est sensé être valide, indépendamment d'un main! Je passerai ce code en librairie normalement à la fin!!!
La seule solution est ... tout mettre dans le .h ...mais bon, en pratique, il est de coutume de séparer définition et description... pour passer les .h et .o!! (sans parler de librairie du coup!)
....et le code...ben c'est un pb général! Donc j'ai déjà tout donné dans le post précédent.;)
Si je te dit que je suis perdu c'est parce que je ne comprend plus rien à ton problème.
Ca ne veut rien dire de faire un include d'un .Cpp sauf :
- avec les template et que tu as mis le code dans un .cpp
- Apparemment les moc*.cpp peut être utile
- je ne vois plus.
Tu as les :
*.h : représente "l'interface" de ton code
*.cpp :ton code
*.o : tes *.cpp compilé
*.so *.dll : lib dynamic regroupant tes *.o
*.a *.lib : lib statique regroupant tes *.o ou interface binaire d'une lib dynamic
Si tu nous donne un code complet d'exemple , on pourra regarder et te dire ce qui va et ne va pas
ben te donner le code complet... ça va faire bcp! J'essaye juste de découper les fichers .h où jusqu'ici il y avait tout en .h et .cpp
Ensuite, je le répète, c'est du C++ de base + stl mais pas de Qt!! Il n'y a pas d'interface. Si j'ai cru que le pb venait de Qt, il est fort possible que non, puisque qu'un projet C++ normal me fait pareil
Donc si on prend le pb a l'envers :
une classe A ... je la définis dans un fichier A.h
je la décrit dans un fichier A.cpp en faisant référence pour les liens à A.h (donc #include "A.h" )
...jusque là, c'est clair ou t'as besoin d'un code complet! :lol:
...voilà, te donner du code, sert pas à grand chose, mon pb est vraiment ridicule et est de ce niveau:?
ensuite une classe B...qui doit se servir de A
...je la definis dans un fichier B.h qui fait référence à A donc avec le lien vers cette classe. Une question pourrait être... je fais l'include de A.h ; A.cpp ou les deux? Je pense que le .h sufft...est-ce exact?
Ensuite pareil, je décrit les méthodes de la classe B... donc include de B.h ...et ensuite, faut-il ajouter des liens supplémentaires vers A?!
En espérant avoir fait trés clair.
Ensuite, j'ai des erreurs qui font références aux cpp compilés... et ben, c'est ce que me donne le retour du compilateur dans ma console!
???
Je n'ai pas dit que c'était un problème QT???Citation:
Ensuite, je le répète, c'est du C++ de base + stl mais pas de Qt!! Il n'y a pas d'interface. Si j'ai cru que le pb venait de Qt, il est fort possible que non, puisque qu'un projet C++ normal me fait pareil
Si il est ridicule, pourquoi demander alorsCitation:
une classe A ... je la définis dans un fichier A.h
je la décrit dans un fichier A.cpp en faisant référence pour les liens à A.h (donc #include "A.h" )
...jusque là, c'est clair ou t'as besoin d'un code complet! :lol:
...voilà, te donner du code, sert pas à grand chose, mon pb est vraiment ridicule et est de ce niveau:?
le .h suffit si c'est bien faitCitation:
ensuite une classe B...qui doit se servir de A
...je la definis dans un fichier B.h qui fait référence à A donc avec le lien vers cette classe. Une question pourrait être... je fais l'include de A.h ; A.cpp ou les deux? Je pense que le .h sufft...est-ce exact?
là pas du toutCitation:
Ensuite pareil, je décrit les méthodes de la classe B... donc include de B.h ...et ensuite, faut-il ajouter des liens supplémentaires vers A?!
En espérant avoir fait trés clair.
C'est là où un petit exemple bidon permettrais de montrer expliquer ton problème. Tu pourrai même trouver ton erreur, qui à mon avis est autre part.Citation:
Ensuite, j'ai des erreurs qui font références aux cpp compilés... et ben, c'est ce que me donne le retour du compilateur dans ma console!
Les bouts code que t'as donnée sont correcte à part :
#include <math.h> devrait être #include <cmath>
il est préférable de ne pas mettre de using dans un .h
il manque le #endif a la fin de B.h
ce n'est pas un probleme de code, garde le chez toi on en a pas besoin. c'est un probleme de link, soit plutot de projet :
- ton fichier CPP n'est pas compilé et donc pas linké (pour cela, glisse une erreur de C++ dedans et verifie que g++ passe bien dessus)
- ton fichier CPP est compilé mais pas linké du tout, dans ce cas, verifie les lignes de commande et essaye de le trouver.
#include "*.cpp" est valide, tres valide meme, seulement si *.cpp est un fichier GENERE et qu'on souhaite ne pas laisser au gestionnaire de projet (msvc, eclipse) le management de ce fichier. si c'est un autre fichier source, alors ca sent le mauvais projet.
Cela ne me parait pas être qu'une erreur de linkCitation:
_erreur type1 : dans stl_iterator.h undefined reference to ...des méthodes de A.h
Je pense également que ce n'est pas une erreur de link
merci screetch pour la remarque...ça sert à quoi un forum?! Si c'est un pb de projet... je ne le sais pas et donc je poste dans cette partie de developpez.com à mon insu!
Je vais tester de glisser une erreur (ce soir) mais depuis le temps que j'utilise ce projet...et va le voir. En tout cas, il le voit très bien pour des erreurs dans A.cpp
...vérifie les lignes de commande... euh, je peux toujours essayer aussi!: )
Et pour Mongaulois qui m'a déjà aidé maint fois :
je voulais dire que te donner 4 fichiers de plus de 10000lignes, ça va pas être pratique pour trouver LE pb...donc je préfère faire un résumé.
Autant pour moi, mais le moc... je n'en ai qu'avec Qt, d'où ma remarque
Il est ridicule dans le sens où je croyais savoir ce que je faisais et qu'en fait...non. Gerer les en-têtes.
ok pour le math et le endif. Je vais essayer de vous écrire un bout de code ce soir.
undefined reférence ce sont toujours des erreurs de link.
ton projet ne tient pas debout en fait. tu melanges les declarations et les implementations, et le compilo ne s'y retrouve pas. les fichiers .h doivent contenir une declaration, les fichiers cpp une implémentation
une declaration doit etre indépendante, c'est a dire ne pas necessiter une implémentation.
chaque implémentation est independante jusqu'a l'etape de link.
inclure un fichier cpp c'est inclure une implémentation. si tu l'inclus plusieurs fois cette implementatiom va se retrouver dupliquer. on ne peut pas dupliquer les implementations.
Pour chaque implementation, chaque chose utilisée doit etre declarée (mais pas forcément implémentée) une et une seule fois. c'est le role des include gard de verifier que chaque declaration n'apparait qu'une fois.
Pour chaque declaration, une implémentation doit etre compilée et une seule. pas plus.
A te lire, je pense que :
- soit les implémentations sont manquantes pour une raison que j'ignore (fichier qui n'est pas dans le projet, donc pas compilé, donc il manque une implementation) ou bien une implementation figure dans un .h et se retrouve dupliquée dans plusieurs modules.
mets du propre, mets tes implementations ou elles doivent se trouver et n'inclus jamais de fichier cpp dans un autre.
OK, je dois vérifier qu'il ne reste pas des méthodes implémentées dans le h en gros! ...je trackerais les {} donc! :)
Merci, je te dirais si c'était ça!;)
Bon après qq tests rapides (j'suis un peu occupé :) ), introduire une erreur dans le .cpp est automatiquement repéré.
...et je crois que j'ai une piste...mon compilateur est corrompu 8O :
Pourquoi? j'en sais rien, c'est une idée...parce que je recompile un projet qui foncitonnait et là, patatra! Ca lui va plus! Retour aux sources : DEVC++.... avec ce programme là :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #ifndef BIDON_H #define BIDON_H class Bidon { public: int unint; Bidon(); //sans ce constructeur (retiré aussi en cpp.... : cf. pbetrange0.png //avec ce constructeur : cf. pbetrange.png } #endif
Code:
1
2
3 #include "Bidon.h" Bidon::Bidon() {}
Code:
1
2
3
4
5
6
7
8
9 #ifndef Bidon2_H #define Bidon2_H #include "Bidon.h" struct Bidon2 { Bidon prems; } #endif
et là, effectivement, je suis...em***dé!Code:#include "Bidon2.h"
Si c'est pas un pb de compilo, c'est quoi?!
lol
faut mettre un ; aprés un class ou une struc ;)t
:roll: ...ah ouais! Bon ça me rassure un peu qd même! En même temps, j'aurais du prendre plus de 3min pour me relire!:oops:
Donc ça ça passe... et pas le gros morceau!:?
si ya un pb de link, je le voie pas, ça doit être un éléphant au milieu du couloir...j'ai mis en commentaire tout sauf qq méthodes (et bien sûr pareil sinon, j'aurais eu une piste sérieuse) ; voici le code réel tant espéré ;) :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #ifndef GSegment_H #define GSegment_H #include <algorithm> using std::max; using std::min; struct GSegment { int debut; int fin; GSegment(int first=0, int second=-1); //888888888888888888888888888888888888888888888888888888888888888888888888888// //_____Questionneurs_____// bool direct() const; int longueur() const; int etendu() const; }; #endif
Code:
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
27
28
29
30
31
32
33
34
35
36
37 #include "GSegment.h" //888888888888888888888888888888888888888888888888888888888888888888888888888// //888888888888888888888888888888888888888888888888888888888888888888888888888// //888888888888888888888888888888888888888888888888888888888888888888888888888// GSegment::GSegment(int first, int second) { debut=first; fin=second; } //888888888888888888888888888888888888888888888888888888888888888888888888888// //888888888888888888888888888888888888888888888888888888888888888888888888888// //888888888888888888888888888888888888888888888888888888888888888888888888888// inline bool GSegment::direct() const//1 si réel(=orienté positivement), 0 sinon { return debut<=fin; } ///// //888888888888888888888888888888888888888888888888888888888888888888888888888// inline int GSegment::longueur() const//+ ou 0 si réel, - sinon { return fin-debut; } ///// //888888888888888888888888888888888888888888888888888888888888888888888888888// inline int GSegment::etendu() const { return fin-debut+1; } /////
Code:
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
27
28
29
30
31
32
33
34
35
36
37
38 #ifndef GLignage_H #define GLignage_H #define demiPi 1.5707963267948966 #include "GSegment.h" #include <vector> #include <algorithm> #include <cmath> using std::vector; struct GLignage { GSegment transseg; vector<GSegment> lignage; //888888888888888888888888888888888888888888888888888888888888888888888888888// //_____Constructeur par defaut_____// GLignage(); //_____Constructeur_____// GLignage(GSegment& seg, vector<GSegment>& vect); //_____Constructeur simple_____// GLignage(GSegment& seg, int position); //_____Destructeur_____// ~GLignage(); //_____Constructeur de recopie_____// GLignage(const GLignage& glig); //_____Operateur d'affectation_____// GLignage& operator=(GLignage& glig); }; #endif
si GLignage ne fait pas parti du projet, ça compile et je peux instancier dans le main. Si GLignage fait partie du projet, de même si aucune méthode de GSegment n'est appelé et sinon :Code:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 #include "GLignage.h" //888888888888888888888888888888888888888888888888888888888888888888888888888// //888888888888888888888888888888888888888888888888888888888888888888888888888// //888888888888888888888888888888888888888888888888888888888888888888888888888// //_____Constructeur par defaut_____// GLignage::GLignage() { transseg=GSegment(0,0); lignage.push_back(transseg); } //_____Constructeur_____// GLignage::GLignage(GSegment& seg, vector<GSegment>& vect) {//on suppose que cette classe est gérée proprement!! (direct) seg.direct(); if(1)//seg.etendu()!=int(vect.size())) { transseg=GSegment(0,0); lignage.push_back(transseg); } else { transseg=seg; lignage=vect; } } //_____Constructeur simple_____// GLignage::GLignage(GSegment& seg, int position) { transseg=GSegment(position,position); lignage.push_back(seg); } //_____Destructeur_____// GLignage::~GLignage() { //lignage.clear(); } //_____Constructeur de recopie_____// GLignage::GLignage(const GLignage& glig) { if(&glig!=this) { transseg=glig.transseg; //lignage.clear(); lignage=glig.lignage; } } //_____Operateur d'affectation_____// GLignage& GLignage::operator=(GLignage& glig) { if(&glig!=this) { transseg=glig.transseg; //lignage.clear(); lignage=glig.lignage; } return *this; }
[linker error] undefined reference to 'GSegment::maméthode (issu=direct() const)'
...et étonnamment, une deuxième fois pareil!
id retourned 1 exit status
Build error ...
...C'est fait avec le même projet que Bidon d'avant (en donnant les bon fichiers dans Dev bien sûr Bidon->GSegment et Bidon2->GLignage) ; Je ne vois pas en quoi c'est différent!!
PS : j'ai rajouté une méthode void method1() dans Bidon et void method2() appellant method1() dans Bidon2 pour pouvoir dire ça, hein.
...:D alors, même avec le code, ça aide pas! hein... j'en suis là aussi malheureusement!:?
ah!
...effectivement, ça résout pas mal:D
ok aussi pour le using
JE regarde si ça résout tout!
MERCI!:king:
Juste une remarque (pas méchante)
Ca n'aide pas du tout du tout mais alors là pas du tout.Citation:
[linker error] undefined reference to 'GSegment::maméthode (issu=direct() const)'
Met plutôt les vrai erreur ;)