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 :

classe template se faisant référence


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut classe template se faisant référence
    Bonjour à tous ,
    le titre du post n'est pas très bien formulé mais je vais essayer de bien expliquer mon problème, que d'autres ont déjà eu mais pour lesquels je n'ai pas bien saisi la solution.
    Je dispose d'une classe A qui contient une liste de pointeurs de classe B, classes templatées. De plus, la classe B contient elle aussi une liste de pointeurs de classe A. J'ai essayé avec les forward declaration mais comme il s'agit de 2 classes template le code ne peut pas être placé dans des fichiers .cpp et donc l'inclusion mutuelle ne peut se faire (je vais tester pour confirmer cela).
    Pouvez-vous me dire que dois-je ajouter en en-tête de fichier au niveau des templates et des forwards declaration ? Sachant que j'ai 2 fichiers .hpp contenant les patrons des classes A et B :
    A.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "B.hpp"
     
    template <typename T>
    class A
    {
        public:
        private:
            std::list<B<T>*> m_listB;
    };
    et B.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template <typename T>
    class A;
     
    template <typename T>
    class B
    {
        public:
        private:
            std::list<A<T>*> m_listA;
    };
    (ce code est indicatif et n'est en aucun cas sensé marcher, mais juste pour se représenter le problème)

    Merci pour votre aide

  2. #2
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Il y a moyen de tricher, mais ça va être quand même assez moche, je pense. (je vais omettre les include guards, pour la simplicité)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // a.hpp
    template <typename T> class B;
     
    template <typename T>
    class A {
       // Déclaration sans aucune fonction définie utilisant B (mais potentiellement déclarée)
    };
     
    #include "a.tpl.hpp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // b.hpp
    template <typename T> class A;
     
    template <typename T>
    class B {
       // Déclaration sans aucune fonction définie utilisant A (mais potentiellement déclarée)
    };
     
    #include "b.tpl.hpp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // a.tpl.hpp
    #include "b.hpp"
     
    // Implémentation de toutes les fonctions de A utilisant B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // B.tpl.hpp
    #include "a.hpp"
     
    // Implémentation de toutes les fonctions de B utilisant A

  3. #3
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Sinon tu peux nous exposer un peu plus ton problème, et peut-être que ceci peu être évité avec un meilleur design. Soit dit en passant, es-tu sur qu'il est judicieux d'utiliser des std::list, supprimes-tu au milieu ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Ekleog : je vais essayer ta solution

    Trademark : En fait, je fais en ce moment un petit jeu en 3D et le principal élément de ce jeu seront des particules balancées par un générateur suivant des courbes plus ou moins aléatoires concernant les trajectoires des particules mais variants pour chaque particule. Etant donné qu'il y a beaucoup de particules qui sont créées assez souvent, je suis obligé de mettre en place un Quadtree pour chaque plan X, Y et Z afin de vérifier si un objet est en collision avec une particule selon le plan X, puis selon le plan Y, puis selon le plan Z.

    Ces Quadtrees contiennent donc une liste de pointeurs d'objets dont les particules font partie. Au départ, je pensais seulement inclure "object.hpp" dans "quadtree.hpp" : plusieurs variables statiques dans la classe object permettaient de savoir si un ou plusieurs objets avaient été crées et non ajoutés dans l'instance Quadtree et un auto update de l'instance quadtree permettait de vérifier tout cela et d'ajouter les objets à la liste à l'intérieur d'un thread.

    Cependant, il serait je pense plus judicieux de faire en sorte que la classe Object puisse accéder à une instance de Quadtree afin d'update le Quadtree uniquement lorsqu'il est nécessaire de le faire (à chaque création ou destruction d'objet). Et c'est la que ça pêche puisque la classe Object est templatée et donc la classe Quadtree doit l'être aussi.
    C'est donc ici que je ne sais pas comment faire et que je sollicite votre aide

    Ps : pour ce qui est de la liste, il est vrai qu'utiliser un deque serait sans doute plus optimisé puisque parfois des éléments seront supprimés au milieu

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/09/2005, 11h30
  2. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  3. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  4. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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