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

Langage C++ Discussion :

Problème d'inclusion de fichiers d'en-tête


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Par défaut Problème d'inclusion de fichiers d'en-tête
    Bonjour,

    J'éprouve quelques difficultés à résoudre un problème d'inclusion de fichiers d'en-tête. La situation est simple : j'ai deux classes, définies et implémentées dans leur fichier .hpp, qui s'utilisent mutuellement. Vous trouverez ci-dessous la structure générale de ces deux classes.

    Fichier point.hpp
    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
    #ifndef POINT_H_INCLUDED
    #define POINT_H_INCLUDED
     
    class circular_dll;
     
    class point
    {
    public:
    	point() { _x = 0; _y = 0; _value = 0; _index = 0; _adjacencies = new circular_dll(); }
     
            ~point() { ... }
     
    ...
     
    private:
    	int _index;
    	double _x, _y, _value;
    	circular_dll *_adjacencies;
    };
     
    #endif
    Fichier circular_dll.hpp
    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 CIRCULAR_DLL_H_INCLUDED
    #define CIRCULAR_DLL_H_INCLUDED
     
    class point;
     
    #include "point.hpp"
     
    class circular_dll
    {
    public:
    	circular_dll() { first = nullptr; last = nullptr; }
     
    	~circular_dll()
    	{ ... }
     
    ...
     
    private:
    	class node
    	{
    	public:
    		point *data;
    		node *prev, *next;
    	private:
    	};
     
    	node *first, *last, *cursor;
    };
     
    #endif
    À la compilation, l'erreur provient de la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _adjacencies = new circular_dll();
    'circular_dll' : no appropriate default constructor available
    Lorsque j'ajoute #include "circular_dll.hpp" dans le fichier point.hpp, la classe point devient inutilisable dans le fichier circular_dll.hpp, à cause de l'inclusion circulaire des en-têtes, malgré les #ifndef.

    En vous remerciant d'avance,

    Nicolas.

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Essaye une fois quelque chose du genre (en séparant définition et implémentation):

    class Point.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
    #ifndef POINT_H_INCLUDED
    #define POINT_H_INCLUDED
    class circular_dll;
     
    class point
    {
    public:
           point();
          ~point();
     
    private:
    	int _index;
    	double _x, _y, _value;
    	circular_dll *_adjacencies;
    };
    #endif
    class Point.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Point::point() { _x = 0; _y = 0; _value = 0; _index = 0; _adjacencies = new circular_dll(); }
    ....
    Idem pour circular_dll.

  3. #3
    Membre confirmé Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Par défaut
    Merci pour votre réponse.

    Voici l'erreur que j'obtiens en séparant l'implémentation de la définition :
    'circular_dll' : no appropriate default constructor available
    Par ailleurs, j'ai remarqué que le problème venait d'autre part. Dans mon fichier main.cpp, j'inclus le fichier point.hpp. Si je retire l'inclusion, ça compile.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2011
    Messages : 342
    Par défaut
    Citation Envoyé par Nadd Voir le message
    Merci pour votre réponse.

    Voici l'erreur que j'obtiens en séparant l'implémentation de la définition :


    Par ailleurs, j'ai remarqué que le problème venait d'autre part. Dans mon fichier main.cpp, j'inclus le fichier point.hpp. Si je retire l'inclusion, ça compile.
    Il faut que tu fasses l'inverse de ce qui t'as été dit. Dans circular_dll tu n'as pas besoin de la définition de point (apparemment tu n'as que des pointeurs sur point).

    Donc dans circular_dll.hpp tu mets

    class Point;

    et dans Point.hpp tu mets le #include "circular_dll.hpp"

  5. #5
    Membre confirmé Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Par défaut
    Dans la classe circular_dll, les pointeurs sur point sont utilisés, et donc la définition est nécessaire.

    J'obtiens l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    use of undefined type 'point'

  6. #6
    r0d
    r0d est actuellement connecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    Bonjour.

    LinuxUser a raison, il faut que tu mettes ton code dans les fichiers sources (.cpp). Les en-têtes (fichiers .hpp) ne doivent contenir que les déclarations.
    Un conseil, lis attentivement cette faq.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/02/2009, 23h58
  2. Réponses: 4
    Dernier message: 31/03/2008, 14h07
  3. Problème d'inclusion de fichiers
    Par _Michel dans le forum C
    Réponses: 1
    Dernier message: 15/03/2008, 17h18
  4. Problème d'inclusion de fichiers
    Par VenusX117 dans le forum C
    Réponses: 8
    Dernier message: 22/10/2006, 11h58
  5. Problème d'inclusion de fichiers
    Par navis84 dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2006, 14h24

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