IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Petit problème avec include


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut Petit problème avec include
    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
    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 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
    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);
         }
    }
    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
    #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;
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut, et bienvenue sur le forum...

    Autant le dire tout de suite, je n'ai pas lu tout le code... Mais,

    Dés le moment où j'entend parler de "classe paramétrée" et/ ou je lis le terme "template" dans un fichier d'en-tête, j'ai tendance à croire que le problème vient de la mécompréhension du principe même des template

    En fait, si, pour des classes non paramétrées, c'est le fichier d'en-tête qui doit être inclu dans le fichier d'implémentation - ainsi d'ailleurs que dans tout fichier qui nécessite de connaitre les classes/fonctions déclarée dans le fichier d'en-tête - il faut savoir que, dans le cas de classes (ou de fonctions) template, l'implémentation est indissociable de la déclaration.

    En effet, le compilateur n'a aucun moyen de créer un code bianire utilisable par le processeur tant qu'il ne sait pas à quel type de donnée il a affaire

    Cela signifie que, chaque fois qu'une spécialisation sera donnée pour une classe ou une fonction template, le compilateur devra créer le code binaire correspondant au type réellement utilisé

    Cela veut aussi dire que, pour pouvoir créer ce code binaire, il doit disposer... du corps de la fonction/des méthodes

    Au final, cela signifie que tu as deux possibilités pour travailler avec les template:
    1. Soit tu fournis l'implémentation directement dans le fichier d'en-tête
    2. Soit tu inclu le fichier d'implémentation dans le fichier d'en-tête (au lieu d'inclure le fichier d'en-tête dans le fichier d'implémentaiton)

    Dans le deuxième cas, on préférera alors ne pas utiliser l'extension ".cpp" - qui pourrait prêter à confusion - mais n'importe quelle autre extension arbitrairement choisie par toi

    Tout cela se trouve clairement précisé dans la FAQ

    [EDIT]grilled, une fois de plus (moi et ma manie de faire des discours )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut Merci !
    Zut désolé ! Je ne pensais pas que le problème était spécifiquement lié aux templates alors je n'avais pas regardé cette partie de la FAQ.

    En tout cas, ton petit discours aura été bien utile, je comprends mieux maintenant.

    Moi aussi je ferai des discours quand je serai devenu un gourou en C++.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un petit problème avec pop
    Par Paulinho dans le forum C++
    Réponses: 4
    Dernier message: 13/11/2005, 20h57
  2. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  3. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo