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 :

Méthodologie include header


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut Méthodologie include header
    Bonjour,

    J'ai crée une petite librairie statique (C++) qui encapsule FMODEX, pour l'instant la librairie comporte juste une classe. Dans le .h de cette classe j'inclus donc le header de fmod à savoir "fmod.hpp" (version C++).

    Le problème arrive quand je veux utiliser cette librairie dans mon projet principal : quand j'inclus le header de la librairie, il essaye d'inclure le header de fmod et ne le trouve bien entendu pas car je n'ai pas rajouté le path vers fmod dans mon projet principal.

    Ceci est un example... On voit bien que la méthodologie employée ici n'est pas correcte. J'avais déjà contourné le problème auparavant en mettant les includes (de fmod dans ce cas) dans les .cpp (de la lib statique dans ce cas) mais je ne pense pas que sa soit la solution optimale, de plus j'ai besoin de l'include dans mon header pour déclarer des attributs...

    J'espère que vous avez compris la situation. J'ai un peu de mal a trouver une solution sur google ne sachant pas quels mots clé utiliser.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il n'y a, malheureusement, pas trente-six solutions...

    Si tu inclues dans un de tes fichiers d'en-tête, un fichier d'en-tête issu d'une bibliothèque tierce, tu crées de facto une dépendance forte vis à vis de cette bibliothèque.

    La conséquence immédiate sera que, si tu crées toi-même une bibliothèque, tu obligera celui qui l'utilisera à... disposer de cette bibliothèque tierce

    Ceci dit, une déclaration anticipée des classes et fonctions de la bibliothèque tierce peut suffire dans certaines conditions, et avec certaines réserves.

    Si donc tu ne fournis qu'une version compilée de ta bibliothèque, tu peux, peut-être, arriver à t'en sortir en créant les déclarations anticipées qui te sont nécessaires et en incluant les fichiers d'en-tête de la bibliothèque tierce dans les fichiers d'implémentation

    Mais, quoi qu'il en soit, cela ne fera pas "disparaitre" pour autant la dépendance de ton projet avec la bibliothèque tierce lors de la compilation, et tu devra donc veiller à indiquer le chemin à utiliser pour accéder aux fichiers d'en-tête de cette dernière et, à l'éditeur de lien, celui permettant d'accéder... au fichier binaire ( .a, .lib, .dll, .so....) de celle-ci
    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

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    Merci pour cette réponse, effectivement j'attentai surement un miracle mais sa n'existe pas en programmation malheureusement !
    Donc en effet si je suis obligé de référencer la bibliothèque utilisée niveau encapsulation c'est un peu moyen... Je pense que je vais quand même faire comme sa si c'est la seule solution.

    Pour les déclarations anticipées j'avoue que je ne comprend pas toutes les implications notamment si on fait une déclaration anticipée dans le header de la librairie on aura par exemple si j'ai bien compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //malib.h (header public)
     
    class MaClasse;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //malibdef.h (header privé)
    #include libencapsulée (ici fmod)
     
    class MaClasse
    {
    ... // definition de la classe
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //malib.cpp
    #include malib.h
    #include malibdef.h
     
    //definition des méthodes
    Comment le projet tiers utilisant cette lib peut-il connaître les méthodes de la classe en ne connaissant que le header public ?

    EDIT : peut être en définissant les méthodes dans le header public et les attributs + méthodes nécessitant des types définis dans la librairie encapsulée (fmod) dans le header privé ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    En fait, les restrictions que tu as au niveau des déclarations anticipées sont, finalement, assez peu nombreuses:
    1. tu ne peux travailler (en attente du fichier dans lequel est effectivement inclus le fichier d'en-tête relatif à la classe déclarée anticipativement) qu'avec des pointeurs ou des références sur la classe déclarée anticipativement
    2. Tu ne peux (en attendant toujours l'inclusion du fichier) absolument pas essayer d'accéder au contenu de la classe
    Il y a une dérogation lorsque tu travailles avec des template, mais c'est surement déjà assez compliqué comme cela, sans que je vienne, en plus, t'embrouiller la tête sur le sujet

    L'idée est donc de travailler sous une forme proche de
    MaClass.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
    //Le garde anti inclusion "classique"
    #ifndef MACLASS_HPP
    #define MACLASS_HPP
    // la déclaration anticipée de la classe issue de fmod
    class LaClassFmod;
    // la définition de ma classe à moi
    class MaClass
    {
        public:
            //les définitions des fonctions se font dans le *.cpp obligatoirement
           MaClass(ClassFmod *): // c'est un pointeur, c'est bon :D
           ClassFmod & get(); // on peut renvoyer une référence (constante ou non)
           void foo(); // une fonction qui manipule ClassFmod
        private:
            ClassFmod * ptr; // un membre doit être soit un pointeur soit une
                             // référence (attention à la durée de vie :D)
    };
    #endif // la fin du garde anti inclusion multiple
    MaClass.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
    //nécessaire pour connaitre la définition de MaClass
    #include <MaClass.hpp>
    // nécessaire pour connaitre la définition de ClassFmod
    #include <laclassfmod.hpp>
    // Le constructeur, pas de quoi casser trois pattes à un canard :D
    MaClass::MaClass(ClassFMod * p):ptr(p){}
    // l'accesseur, non plus :D
    ClassFmod & MaClass::get(){return *ptr;}
    // Pour foo, il faut connaitre le contenu de ClassFmod...
    // Ca tombe bien, on a inclus le fichier dans lequel se trouve la définition :D
    void MaClass::foo()
    {
        /* ... */
        ptr->desPommes();
        ptr->desPoires();
        ptr->etDesScouBidouBidou();
        ptr->wouah();
        /* ... */
    }
    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

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Une autre approche est de différencier l'interface proposée par ta bibliothèque des détails d'implémentations effectif par l'utilisation du pimpl-idiom conjuguée à la déclaration anticipée : cf ici.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    Salut, d'après ce que je vois les 2 méthodes proposées sont à peu près équivalentes.

    J'ai implémenté le pimpl idiom et maintenant je n'ai en effet plus besoin d'inclure le header de fmod ni le .lib dans mon projet principal. Sa me convient donc parfaitement .

    Merci à vous

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

Discussions similaires

  1. Include header+css = Pas de css
    Par malgach dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 13/10/2012, 12h44
  2. include + header = bug
    Par esti89 dans le forum Langage
    Réponses: 20
    Dernier message: 25/06/2008, 15h01
  3. include headers c dans un prog en c++
    Par grabriel dans le forum C++
    Réponses: 17
    Dernier message: 24/04/2008, 16h33
  4. [VC++] Problème include de header
    Par Yellowmat dans le forum MFC
    Réponses: 10
    Dernier message: 08/12/2005, 13h50
  5. [compil] #include <header> ou #include <head
    Par guejo dans le forum MFC
    Réponses: 5
    Dernier message: 02/06/2004, 15h31

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