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 :

Class template et inclusion cyclique


Sujet :

C++

  1. #1
    lpa
    lpa est déconnecté
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 39
    Points : 54
    Points
    54
    Par défaut Class template et inclusion cyclique
    Bonjour,
    J'ai un soucie avec mon code: J'ai une class template ( ThirdPersonCamera ) qui est écrite dans un .h.
    Cette class possède une fonction addToScene() qui n'utilise pas le template mais qui utilise un objet Scene que je ne peux pas inclure dans le ThirdPersonCamera.h car cela cause une inclusion cyclique du faite que Scene.h inclu deja ThirdPersonCamera.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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    ThirdPersonCamera.h
           class Scene;
           template <class T>
    	class ThirdPersonCamera : public Camera
    	{
    		public:
                ThirdPersonCamera(std::string name, Scene* scene, T* target)
                {
                    init(name, scene, Vector3(50,10,50), target->getPosition());
                    mTarget = target;
     
                }
     
                ~ThirdPersonCamera()
                {
     
                }
     
                void syncRenderablesPhysics(void)
                {
     
                }
    		protected:
                      void addToScene(Scene* scene)
                     {
                          scene->addActor<ThirdPersonCamera>(this);
                      }
     
    		private:
                T* mTarget;
     
    	}
    error: invalid use of incomplete type ‘struct Scene’|
    j'ai essayé de mettre dans mon cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     #include "ThirdPersonCamera.h"
    #include "Scene.h"
               void ThirdPersonCamera::addToScene(Scene* scene)
                {
                    scene->addActor<ThirdPersonCamera>(this);
                }
    /error: ‘template<class T> class ThirdPersonCamera’ used without template parameters|
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "ThirdPersonCamera.h"
    #include "Scene.h"
     
        template <class T>
        void ThirdPersonCamera<T>::addToScene(Scene* scene)
        {
            scene->addActor<ThirdPersonCamera>(this);
        }
    ]+0x10)||undefined reference to `
    ThirdPersonCamera<AnimatedMesh>::addToScene(Scene*)'|
    Si quelqu'un a une idée
    merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Essaye la déclaration anticipée (forward declaration) de ta classe Scene.

  3. #3
    lpa
    lpa est déconnecté
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par oodini Voir le message
    Essaye la déclaration anticipée (forward declaration) de ta classe Scene.
    Merci de ta réponse, j'avais oublié de le mettre c'est ce que je fait deja, mais du faite d’appeler la fonction addToScene() de cette objet j'ai l'erreur invalid use of incomplete type ‘struct Scene’|

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par lpa Voir le message
    Merci de ta réponse, j'avais oublié de le mettre c'est ce que je fait deja, mais du faite d’appeler la fonction addToScene() de cette objet j'ai l'erreur invalid use of incomplete type ‘struct Scene’|
    Laisse la déclaration de addToScene() en place, et déplace sa définition sous la définition de la classe Scene, en dehors du template (comme tu le ferais pour une classe normale).

    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
     
    class Scene;
     
    template <class T>
    class ThirdPersonCamera : public Camera
    {
       ...
    protected:
        void addToScene(Scene* scene);
       ...
    };
     
    class Scene
    {
    ...
    };
     
    template <class T>
    void ThirdPersonCamera<T>::addToScene(Scene *scene)
    {
        scene->addActor<ThirdPersonCamera>(this);
    }
    L'autre solution consiste à essayer de se débarrasser de cette référence circulaire : c'est un couplage très fort, trop fort probablement. D'ailleurs, j'ai du mal à comprendre pourquoi la classe Scene doit connaître ThirdPersonCamera.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    lpa
    lpa est déconnecté
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Laisse la déclaration de addToScene() en place, et déplace sa définition sous la définition de la classe Scene, en dehors du template (comme tu le ferais pour une classe normale).
    Je n'est pas bien compris ce que tu veux me dire, je laisse la déclaration dans le fichier ThirdPersonCamera.h et je met la définition dans le fichier ThirdPersonCamera.cpp dans le quel je fait un include "Scene.h" ?
    Si c'est de cela que tu parle j'ai déjà essayé cela me donne "error: ‘template<class T> class ThirdPersonCamera’ used without template parameters"

    L'autre solution consiste à essayer de se débarrasser de cette référence circulaire : c'est un couplage très fort, trop fort probablement. D'ailleurs, j'ai du mal à comprendre pourquoi la classe Scene doit connaître ThirdPersonCamera.
    En effet j'y est pensé mais cela me parait assez difficile a faire car Scene.h a beaucoup de dépendance qui elle même peuvent faire appelle a ThirdPersonCamera.h mais c'est surement ce que je vais faire si je ne trouve pas d'autre solution.
    merci

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    De manière générale, je constate que ThirdPersonCamera a beau etre une classe template, elle hérite, avant tout, d'une classe (non template celle-là) Camera...

    Or, ta scene devrait sans doute pouvoir travailler avec n'importe quel type de caméra, et tu devrais donc pouvoir t'en sortir avec l'inclusion de... camera.h!!!

    il n'y aurait donc qu'à t'assurer que camea fournit une interface suffisante pour pouvoir manoeuvrer ta ThirdPersonCamera
    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

  7. #7
    lpa
    lpa est déconnecté
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    De manière générale, je constate que ThirdPersonCamera a beau etre une classe template, elle hérite, avant tout, d'une classe (non template celle-là) Camera...

    Or, ta scene devrait sans doute pouvoir travailler avec n'importe quel type de caméra, et tu devrais donc pouvoir t'en sortir avec l'inclusion de... camera.h!!!

    il n'y aurait donc qu'à t'assurer que camea fournit une interface suffisante pour pouvoir manoeuvrer ta ThirdPersonCamera
    Pour le moment j'ai réussi a retravailler la scene pour supprimer sa dépendance a toute camera, mais ce qui me fait un peu peur c'est que scene a pas mal de dépendance et que je ne peu plus, du coup lui ajouter de dépendance qui possèdent elle meme une dépendance envers la caméra

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par lpa Voir le message
    Pour le moment j'ai réussi a retravailler la scene pour supprimer sa dépendance a toute camera, mais ce qui me fait un peu peur c'est que scene a pas mal de dépendance et que je ne peu plus, du coup lui ajouter de dépendance qui possèdent elle meme une dépendance envers la caméra
    De toutes manières, j'aurais vraiment tendance à penser que, si scene a vraiment autant de dépendances que ce que tu semble dire, c'est qu'il y a déjà, à la base, un sérieux problème de conception

    Tu devrais, peut etre, essayer de réfléchir au fait que tu en demande beaucoup trop à ta scene, et, pourquoi pas, te rappeler quelques principes de base tels que la fameuse loi demeter ( si une classe B utilise une classe C et qu'une classe A utilise la classe B, il n'y a, a priori, aucune raison pour que la classe A aie ne serait ce qeu connaissance de l'existence de la classe C ) ou le principe de la responsabilité unique (si une classe ou une fonction a plus d'une responsabilité, c'est sans doute qu'elle en a trop ) !

    Je ne sais pas quelle forme prend ton projet, mais, de manière générale, la scene devrait se "contenter" de gérer la (les) vues et de leur permettre, le cas échéant, de communiquer entre elles et ce sont les vues qui devraient se charger de la gestion des caméra.

    Et, si tu rajoute du son ou de l'intelligence artificielle, cela devrait etre géré "plus haut" (au niveau de la partie ou de l'application, par exemple )
    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

  9. #9
    lpa
    lpa est déconnecté
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 39
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par koala01 Voir le message
    De toutes manières, j'aurais vraiment tendance à penser que, si scene a vraiment autant de dépendances que ce que tu semble dire, c'est qu'il y a déjà, à la base, un sérieux problème de conception

    Tu devrais, peut etre, essayer de réfléchir au fait que tu en demande beaucoup trop à ta scene, et, pourquoi pas, te rappeler quelques principes de base tels que la fameuse loi demeter ( si une classe B utilise une classe C et qu'une classe A utilise la classe B, il n'y a, a priori, aucune raison pour que la classe A aie ne serait ce qeu connaissance de l'existence de la classe C ) ou le principe de la responsabilité unique (si une classe ou une fonction a plus d'une responsabilité, c'est sans doute qu'elle en a trop ) !

    Je ne sais pas quelle forme prend ton projet, mais, de manière générale, la scene devrait se "contenter" de gérer la (les) vues et de leur permettre, le cas échéant, de communiquer entre elles et ce sont les vues qui devraient se charger de la gestion des caméra.

    Et, si tu rajoute du son ou de l'intelligence artificielle, cela devrait etre géré "plus haut" (au niveau de la partie ou de l'application, par exemple )
    Merci pour ces conseils j'ai encore du mal avec l'architecture, je vais essayer de suivre ce que tu me dit et allégé la scene au maximum.

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

Discussions similaires

  1. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36
  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