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 :

Templates -> problème d'include


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut Templates -> problème d'include
    Bonjour, j'ai codé et tente de compiler quelques classes template pour gérer Points, Vecteurs, Droites, etc ... en 2D.

    En tentant de mettre chaque classe dans un fichier hpp, impossible de trouver une astuce pour compiler, il me dit toujours que l'objet truc n'a pas été défini, etc ... Le fait est que j'arrive très bien à compiler en mettant tout mon code dans un seul fichier énorme, donc voici la structure :

    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
    #ifndef TRUC
    #define TRUC
     
    template <typename T>
    class Line;
     
    template <typename T>
    class Vector
    {
        public :
        //defs des méthodes de Vector, utilisant entre autre des paramètres de type const Line<T>&
    };
     
    template <typename T>
    class Point
    {
        public :
        //idem -> utilise des const Line<t>&
    };
     
    template <typename T>
    class Line
    {
        public :
        //méthodes de Line
     
       Vector<T> vector;
       Point<T> point;    //attributs publics
    };
     
    //et ici, toutes les méthodes et surcharges d'opérateurs
    //sachant que celles de Vector utilisent celles de Line
    //celles de Point utilisent Vector et Line
    //celles de Line utilisent Vector et Point
    Voilà, je vois pas comment séparer le tout en mettant comme d'habitude, une classe dans un fichier ....
    Y-a-t-il une méthode pour organiser ses template ?

    PS : j'ai déjà séparé code source et définition en utilisant l'astuce du fichier .tpp (lien), et en metant #include "Vector.tpp" à la fin de la définition de Vector,
    mais ça ne change pas grand chose au problème ....

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut
    Résolu :

    Pour les générations futures : mon problème était la position de mes includes : j'utilisais un namespace, et j'avais mis l'include dedans, ce qui mettait la pagaille ...

    Solution :

    Vector.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
    #ifndef VECTOR_HPP
    #define VECTOR_HPP
     
    namespace esp
    {
        template <typename T>
        class Line;
     
        template <typename T>
        class Vector
        {
           ...
        };
     
        template <typename T>
        bool operator==(const ...);
    }
     
    #include "Line.hpp" //on complète le type Line
     
    #include "Vector.tpp"
     
    #endif
    Et dans Vector.tpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef VECTOR_TPP
    #define VECTOR_TPP
     
    namespace esp
    {
       //code des méthodes, fonctions, opérateurs, etc .... en inline
       //exemple :
       template <typename T>
       inline bool operator(...)
    }
     
    #endif
    Les autres fichiers sont sur ce modèle, avec dans Line.hpp,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "Vector.hpp"
    #include "Point.hpp"
     
    namespace esp
    {
    ...
    Il faut mettre les includes HORS de namespace {} !

    Voilà tout !

  3. #3
    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,
    Merci pour les générations futures

    Néanmoins, si les fonctions de Point utilisent Vector et Line, c'est probablement qu'il y a un problème de conception (fonctions libres plutôt que fonctions membre ?). La circularité des dépendances est signe d'un tel problème.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut
    J'aurai pu faire autrement en effet.
    Je voulais des méthodes du type Poit::is_in(Line, segment, etc ....)

    Mais j'aurais pu le faire faire à Line, ces dépendances circulaires peuvent, dans mon cas, être enlevées très simplement.

    En tout cas la méthode que j'ai employée fonctionne, libre aux personnes qui lirons ce que j'ai écrit de l'utiliser !

  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,

    Effectivement, il faudrait probablement préciser quelque part d'éviter de faire un include dans un espace de nom (ou du moins expliquer ce qui se passe alors). Car si j'ai bien compris, c'était d'abord ça ton problème, la circularité n'étant finalement que ce qui a permis de le révéler.

    Cependant, je maintiens que les dépendances circulaires indiquent un potentiel problème de conception. Et peuvent aboutir à des comportements très inattendus avec les template, notamment si tu fais des spécialisations.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Par défaut
    Et dans la floppée de liens qu'on obtient sur google concernant la conception en c++, y-a-til des bonnes adresses où on explique comment BIEN concevoir son code ?

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

    Informations professionnelles :
    Activité : aucun

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

    Tu peux déjà passer sur le blog d'emmanuel delonguet, membre de ce forum...

    Il y parle régulièrement de conception, et ses articles sont généralement très bien écrits

    Ceci dit, la meilleure manière de bien concevoir son code, c'est d'avoir une conception technique correcte

    Le code que tu écris, quel qu'il soit, quel que soit le langage, n'est jamais que l'expression de quelque chose à laquelle tu as un minimum pensé.

    Les fondations nécessaires pour obtenir un "bon" code, qui soit à la foit évolutif et facilement maintenable se rapprochent donc toutes de la citation de ma signature:
    Ce qui se conçoit bien s'énonce clairement et les mots pour le dire vous viennent aisément
    Pour y arriver, il faut comprendre et savoir appliquer, "oserais-je dire au pied de la lettre" quelques règles, principes et loi énoncées valides pour tout développement informatique (même si elles doivent parfois être adaptées pour respecter les contraintes imposées par certains langages) depuis déjà quelques temps.

    Parmis ceux-ci, on peut très certainement citer cinq grand pilliers pour la conception orientée objets:
    • OCP (Open Close Principle) ou "Principe Ouvert Fermé"
    • SRP (Single Responsability Principle) ou "Principe de la responsabilité unique"
    • ISP (Interface Segregation Principle) ou "Principe de la Ségrégation des Interfaces"
    • LSP (Liskov Substitution Principle) ou "Principe de Substitution de Liskov"
    • DIP(Dependancies Inversion Principle) ou "Principe d'inversion des Dépendances"

    Certains principes tirés directement de l'Xtrem Programming peuvent aussi s'avérer des plus intéressants, comme
    • DRY (D'ont Repeat Yourself)
    • KISS(Keep It Simple, Stupid)
    • YAGNI (You ain't gonna need it)
    • ...
    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

  8. #8
    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,
    Je ne connais pas de site qui propose un cours/tuto construit complètement autour des principes de conception.

    Le site object mentor de Robert Martin, contient énormément d'articles intéressants.

    Le site proposé par Koala est celui d'Emmanuel Deloget.

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

Discussions similaires

  1. Facelet templating + refresh selectif + a4j:include problème
    Par chriscoolletoubibe dans le forum JSF
    Réponses: 6
    Dernier message: 03/04/2010, 00h17
  2. [EasyPHP] Problème d'include de fichier et adresse des images
    Par doudou34 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 02/11/2005, 21h46
  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. [JSP] problème d'include ou d'import
    Par lipao17 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 06/04/2005, 13h39
  5. Problème d'include sous Dev-c++ 4.9.8.0
    Par Argonz dans le forum Dev-C++
    Réponses: 16
    Dernier message: 20/11/2003, 17h36

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