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 :

[POO] Problème de redéfinition de méthodes


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut [POO] Problème de redéfinition de méthodes
    Au collège, ils nous ont enseigner seulement du Java, donc lorsque je veux faire quelque chose d'un peu plus poussé, je me retrouve avec ce problème...


    J'ai 2 classes toute simples.


    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
    class a
    {
        public :
        int ID;
     
        void f()
        {
    	...
        }
     
        a()
        {
            ID = 0;
        }
     
    };
     
    class b: public a
    {
        public :
        int x;
     
        b()
        {
            ID = 1;
        }
     
    	void f()
    	{
    		...
    	}
     
    };
    Ensuite, si je déclare un object a et un object b, aucun problèmes. Si je déclare un pointeur a et qu'il pointe vers un object b, je dois simplement changer f en virtuel, aucun problèmes.

    Mon problème, c'est que je n'ai aucune idée de combien il va y avoir d'objects a ou b, donc je les store dans un tableau d'object a. Ensuite, quand vient le temps d'appeler la méthode f, j'appelle toujours celle de a. J'ai essayé de caster l'objet sortant du tableau en b lorsque ID = 1, mais cela me donne une erreur "a cannot be cast to b". Ceci marche en java, je m'en suis servis plusieurs fois au travail, mais il y a probablement une petite nuance C++ que j'oublie, et à cause de celle-ci, il m'est impossible de pouvoir accéder à la valeur x de b aussi-tot qu'il est inséré dans un tableau de a.

    J'ai essayé aussi avec un vecteur, même résultat.

  2. #2
    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
    Bonjour,
    1/ Tu trouveras ici des informations sur les cast ;
    2/ Tu trouveras ici des informations sur les membres virtuels ;
    3/ C'est une erreur que de mettre un ID dans ta classe pour identifier son type. Cela est souvent inutile et relève de l'erreur de conception.
    4/ Comme indiqué dans la FAQ sur le cast, si tu as une collection de a et qu'à un moment tu dois downcaster vers un b, c'est que tu as probablement un problème de conception.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ne pas oublier que pour que les fonctions virtuelles marchent pour des objets dans un conteneur, il faut en C++ passer par des pointeurs.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    3/ C'est une erreur que de mettre un ID dans ta classe pour identifier son type. Cela est souvent inutile et relève de l'erreur de conception.
    4/ Comme indiqué dans la FAQ sur le cast, si tu as une collection de a et qu'à un moment tu dois downcaster vers un b, c'est que tu as probablement un problème de conception.
    Le ID je peut faire sans, je l'ai ajouté beaucoup plus tard après que mes essais de méthodes virtuel ne marchait pas, lorsque j'ai tenté de casté.

    Pour le downcast, je pense bien que je n'ai pas le choix tant que je ne réussis pas a faire marché ma méthode virtuelle, mais si tu as une autre suggestion, j'aimerais bien la savoir.

    Je travaille présentement sur un engine graphique en DirectX. Dans mes jeux précédent, j'utilisais un GraphicObject qui contenait tout ce qu'il pouvait contenir. Il contenait des variables reliées à l'animation et à plusieurs d'autres effets même s'il ne se servait jamais. Ca fonctionne, mais ca alourdi le rendu avec un paquet de conditions qui sont souvent innutile.

    Ce que j'essais de faire c'est de créé plusieurs sous-GraphicObject, tel que AnimatedGraphicObject. De cette façon, les variables pour la gestion d'animation ne se retrouve pas dans un GlowingGraphicObject ou dans background inanimé.

    Comme j'ai dit plus haut, ma fonction virtuelle fonctionne... jusqu'à temps que j'utilise un conteneur. Dans les FAQs, il n'y a que ce qui fonctionne déjà pour moi et rien sur mon problème.

    Citation Envoyé par JolyLoic Voir le message
    Ne pas oublier que pour que les fonctions virtuelles marchent pour des objets dans un conteneur, il faut en C++ passer par des pointeurs.
    J'ai essayé de plusieurs façons, toujours sans résultats positif.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu les stockes dans un tableau de a, donc tous les b deviennent des a. Il te faut un tableau de pointeurs vers a.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Tu les stockes dans un tableau de a, donc tous les b deviennent des a. Il te faut un tableau de pointeurs vers a.
    C'est ce que je dit depuis le début. Comme j'ai dit, j'ai essayé de plusieurs façons (c'est à dire toute celles qui me venaient en tête) et aucunes n'a fonctionné. Mais un ami qui étudié dans un collège ou ils enseignaient le C++ a répondu à ma question, donc le problème est résolue!

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par ShadowOfEden Voir le message
    C'est ce que je dit depuis le début.
    Alors je ne vois pas où était ton problème. Sauf si tu n'as pas compris ce qui se passait.

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

    Informations professionnelles :
    Activité : aucun

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

    Bien que tu sembles avoir trouvé une réponse ailleurs, il faut savoir que, si tu dois gérer une collection d'objets polymorphes, le mieux reste toujours d'utiliser le conteneur fournit par la STL qui correspond le mieux à tes besoins en utilisant ce diagramme récapitulatif et de stocker des pointeurs vers l'objet de base.

    Ainsi, le mieux est peut etre un code proche de
    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
    int main()
    {
        /* déclaration d'une collection d'objets dérivés de A */
        std::vector<A*> tab;
        /* ajout d'éléments dérivés de A (B, C et D) ... voir de A le cas
         * échéans
         */
        tab.push_back(new A/*( parametres éventuels) */);
        tab.push_back(new B/*( parametres éventuels) */);
        tab.push_back(new C/*( parametres éventuels) */);
        tab.push_back(new D/*( parametres éventuels) */);
        /* appel d'un comportement polymorpe sur tous les éléments
         */
        for(size_t i=0;i<tab.size();++i)
            tab[i]->fonction();
        /* nous aurions pu utiliser des itérateur (constants ou non)
         */
        for(std::vector<A*>::const_iterator it= tab.begin();it!=tab.end();++it)
            (*it)->fonction();
        /* ne pas oublier de libérer correctement la mémoire
         */
        for(size_t i=0;i<tab.size();++i)
            delete tab[i];
        return 0;
    }
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Alors je ne vois pas où était ton problème. Sauf si tu n'as pas compris ce qui se passait.
    Je savais ou était mon problème, je ne savais seulement pas comment faire ce que je voulais faire (un conteneur de pointeur pour que le B ne deviennent pas un simple A)

    Citation Envoyé par koala01 Voir le message
    Salut,

    Bien que tu sembles avoir trouvé une réponse ailleurs, il faut savoir que, si tu dois gérer une collection d'objets polymorphes, le mieux reste toujours d'utiliser le conteneur fournit par la STL qui correspond le mieux à tes besoins en utilisant ce diagramme récapitulatif et de stocker des pointeurs vers l'objet de base.

    Ainsi, le mieux est peut etre un code proche de
    Merci beaucoup même si j'ai déjà ma réponse car c'est exactement ce que je cherchait et c'est très détaillé.

    Pour le type de conteneur, mes réponses dans le diagramme sont toujours non. Pour l'instant je travaille avec un tableau car je travail sur l'engin graphique et le conteneur appartient au jeu donc je peut utilisé n'importe quel conteneur car ca me sert seulement de test.

    Comme j'ai dit plus haut, mon conteneur contient tout les objects à être afficher. Leur ordre n'a pas donc pas d'importances. Dans mon ancien engin graphique, j'avais plusieurs tableau pour chaques types. Pour les projectiles, par exemple, lorsqu'elle n'est plus affiché (qu'elle sortent de l'écran ou qu'elle touche une cible) un bool est changé pour false. Un compteur gardait le compte de quel projectile était le prochain et celui-ci était réinitialisé lorsque nécessaire. Je n'ai jamais eu le problème, mais il y a toujours la possibilité qu'il y ait trop de projectiles et qu'un nouveau reinitialise un projectile déja actif. De plus, 60 fois par secondes, je devais parcourir un tableau pour lire un bool même s'il n'y avait aucun projectiles à l'écran.

    Donc je crois que le vecteur serait le meilleur choix pour moi, car je pourrait avoir le nombre de projectiles nécessaire et effacé un en plein millieu sans avoir a déplacé les objets suivant contrairement à dans un tableau. Si tu as d'autres suggestions ou quelque choses auquel je n'ai pas pensé, merci de m'en faire part.

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

Discussions similaires

  1. [Débutant] [POO]Problème de polymorphisme avec la méthode ToString()
    Par vmolines dans le forum C#
    Réponses: 5
    Dernier message: 08/02/2012, 00h19
  2. [PHP 5.3] [POO]Problème avec une méthode statique
    Par yann18 dans le forum Langage
    Réponses: 6
    Dernier message: 25/05/2011, 19h32
  3. [POO] Problème avec setInterval/méthodes d'écriture
    Par Lpu8er dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/07/2006, 15h37
  4. Réponses: 11
    Dernier message: 29/04/2005, 19h45
  5. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02

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