Bonjour,
J'ai un petit problème avec Dev C++. J'essaye de programmer quelques fonctions sur les arbres binaires de recherche en utilisant les modèles. J'ai un fichier abr.h pour les déclarations, un fichier abr.cpp pour l'implémentation et un fichier main.cpp pour tester avec une fonction main.
Dans le fichier abr.cpp j'ai mis #include "abr.h" pas de problème aucune erreur la dessus.
En revanche dans le fichier main.cpp si j'ajoute #include "abr.h" lorsque je crée un arbre paramétré il ne semble pas faire le lien (undefined reference) avec les déclarations de abr.cpp. Par contre si je mets #include "abr.cpp" à la place tout marche correctement.
Quelqu'un pourrait-il m'expliquer ou est le problème ? J'ai cru comprendre qu'il fallait mieux éviter de faire des inclusions de .cpp ...
D'avance merci !
Voici le listing du code non terminé mais à priori sans erreurs :
fichier abr.h
fichier abr.cpp
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
27
28
29
30 #ifndef ABR_H #define ABR_H #include<iostream> using namespace std; template<class C, class V> class Abr{ public: Abr(); bool estVide() const; V& get(const C& c); bool ajouter(const C& c, const V& v); void afficher(ostream& out=cout) const; private: static C CLE_DEFAUT; static V VALEUR_DEFAUT; C cle; V valeur; Abr<C,V> *g, *d; void attacher(const C& c,const V& v){ cle = c; valeur = v; g = new Abr(); d = new Abr(); } const Abr<C,V>* chercher(const C& c) const; }; #endif
fichier main.cpp
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 #include "Abr.h" template<class C, class V> C Abr<C,V> :: CLE_DEFAUT=0; template<class C, class V> V Abr<C,V> :: VALEUR_DEFAUT=0; template<class C, class V> Abr<C,V>::Abr():cle(CLE_DEFAUT),valeur(VALEUR_DEFAUT),g(NULL),d(NULL){ } template<class C, class V> bool Abr<C,V>::estVide() const{ return Abr<C,V>::cle=CLE_DEFAUT && Abr<C,V>::valeur=VALEUR_DEFAUT && g=NULL && d=NULL; } template<class C, class V> V& Abr<C,V>::get(const C& c){ return chercher(c)->valeur; } template<class C, class V> bool Abr<C,V>::ajouter(const C& c, const V& v){ Abr<C,V>* x = this; while(!x->estVide()){ if(x->cle<c) x=x->g; else if(x->cle>c) x=x->d; else if(x->cle == c) return false; } if(x->estVide()) x->attacher(c,v); return true; } template<class C, class V> void Abr<C,V>::afficher(ostream& out) const{ if(!estVide()){ g->Abr<C,V>::afficher(out); out << cle; d->Abr<C,V>::afficher(out); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <cstdlib> #include <iostream> #include "Abr.h" using namespace std; int main(int argc, char *argv[]) { Abr<int,int> arbre; // petit test de création d'un arbre qui foire avec #include "Abr.h" et marche avec #include "Abr.cpp" system("PAUSE"); return EXIT_SUCCESS; }
Partager