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 :

Include et template/inline


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut Include et template/inline
    Bonjour,

    J'ai toujours utilisé les fichiers .h pour déclarer mes classes C++ et les fichiers .cpp pour le code source. Pour les classes qui utilisent les templates et les méthodes inlines: où faut-il mettre le code source ? :
    - Dans les fichiers .cpp: ça ne fonctionne pas
    - Dans les fichiers .h: on n'y met que de la déclaration, pas du code source

    J'ai parfois vu ceci:
    classA.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
    #ifndef CLASS_A_H
    #define CLASS_A_H
     
    #include <vector>
    //ici, tous les autres include
     
    template<class T> class classA
    {
    public:
      classA();
    };
     
    #include "classA.inl"
     
    #endif
    classA.inl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class T> inline classA<T>::classA()
    {
      //du code source ici
    }
    Ca fonctionne bien et ça me semble assez logique.

    Mon problème:
    J'ai deux classes: A et B qui sont toutes les deux des templates. La classe A à besoin de la class B, j'ajoute donc un '#include "B.h"' dans le fichier 'A.h'.
    Jusque là pas problème. Maintenant imaginons que la classe B à aussi besoin de la classe A: je ne peux pas ajouter un '#include "A.h"' (include cyclique).

    Comment faire ?
    Info: la solution proposé ici ne fonctionne pas pour la classe template/inline: http://cpp.developpez.com/faq/cpp/?p...erence_croisee

    Merci d'avance

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Je suppose que b.inl qui nécessite A.h et A.h inclut b.h.
    Si sa correspond à un de ces cas, il te suffit de faire l'include du b.inl à la fin de A.h et non a la fin de b.h : Peu importe quand les .inl sont inclus, ils servent de .cpp

  3. #3
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par zenux Voir le message
    - Dans les fichiers .h: on n'y met que de la déclaration, pas du code source
    Si tu vas jeter un petit coup d'œil aux sources de la STL, tu risques d'être surpris...
    http://cpp.developpez.com/faq/cpp/?p...INE_non_membre
    http://cpp.developpez.com/faq/cpp/?p...#INLINE_membre
    http://cpp.developpez.com/faq/cpp/?p...tre_definition

    Citation Envoyé par zenux Voir le message
    Info: la solution proposé ici ne fonctionne pas pour la classe template/inline: http://cpp.developpez.com/faq/cpp/?p...erence_croisee
    Cette solution fonctionne aussi bien pour les classes template que pour les classes non template, à condition de mettre la déclaration complète (donc avec le mot-clé « template », suivi des paramètres template).
    Il y a juste une petite restriction qui s'applique dans tous les cas :
    La solution à ce problème est d'utiliser des déclarations anticipées (forward declaration). Au lieu d'inclure l'en-tête définissant une classe, on va simplement déclarer celle-ci pour indiquer au compilateur qu'elle existe. Cela marche car tant qu'on n'utilise qu'un pointeur ou une référence, le compilateur n'a pas besoin de connaître en détail le contenu de la classe. Il a juste besoin de savoir qu'elle existe. Par contre au moment d'utiliser celle-ci (appel d'une fonction membre par exemple) il faudra bien avoir inclus son en-tête, mais ce sera fait dans le .cpp et non plus dans le .h, ce qui élimine le problème d'inclusion cyclique.

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Pour faire une réponse plus constructive, tout ce qui est « inline » est censé être remplacé par sa définition à chaque appel.
    Elle doit donc être accessible de partout.
    Autrement dit, la définition d'un quelque chose qui est inline se place toujours dans le fichier d'en-tête.

    Pour les « template », et l'include à la fin du fichier d'en-tête, va voir ici :
    http://cpp.developpez.com/faq/cpp/?p...VERS_templates.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/03/2013, 22h03
  2. Probleme include PHP template wordpress
    Par cisqo dans le forum Langage
    Réponses: 0
    Dernier message: 11/09/2012, 01h04
  3. Templates & inline
    Par oodini dans le forum Langage
    Réponses: 10
    Dernier message: 05/01/2012, 16h02
  4. Réponses: 4
    Dernier message: 25/06/2009, 00h37
  5. [Système] template + include
    Par Yoshio dans le forum Langage
    Réponses: 15
    Dernier message: 16/11/2006, 17h42

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