Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les classes secondaire

    15 septembre 2007 à 21:55:30

    Bonjour à tous

    J'ai lu le chapitre en C++: "Classes et pointeurs"

    Comme j'ai m@teo l'explique, j'ai fait une classe arme en utilisant les pointeurs.
    Il nous explique comment à partir de la classe Personnage passé à la classe arme grâce à la fléche (->).

    Mon probléme:
    Peut t'on accédé à une methode de classe arme directement sans passé par une methode de classe personnage? si oui comment ?

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      15 septembre 2007 à 22:01:47

      faut :
      soit que ta variable de type Arme soit publique.
      soit que tu crées une méthode qui renvoie ton pointeur arme.
      • Partager sur Facebook
      • Partager sur Twitter
        15 septembre 2007 à 22:24:23

        Je ne comprend pas se que tu veux m'expliquer.

        Je n'ai pas parler d'accés à une variable d'une classe.
        Mais d'un appel de methode de la classe Arme.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 septembre 2007 à 22:37:26

          sans héritage : non.
          • Partager sur Facebook
          • Partager sur Twitter
            15 septembre 2007 à 22:46:56

            Je comprend pas trop, tu veut acceder à une classe arme contenu dans un Personnage dans le main sans faire Personnage->arme ?
            Je vois pas trop l'intérrêt, mais oui c'est possible.
            Mais sa ne serais pas utile car il faudrait initialiser un pointeur de type Arme n'appartenant pas a Personnage sur l'arme pour pouvoir y accéder dans le main sans passer par Personnage.

            exemple :

            1. int main(int argc, char *argv[])
            2. {
            3.     Personnage perso;
            4.     Arme *arme;
            5.     arme = perso.arme;
            6.     std::cout << arme->getDegats() << std::endl;
            7. }


            Dans le cas où l'arme de perso est public, ou alors il faut faire un accesseur.
            Mais bon, aucune utilité de créer un pointeur de type Arme pour ça...
            Autant mieux directement marquer perso->arme->getDegats();

            PS : Que vient faire l'héritage la dedans ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 septembre 2007 à 23:11:10

              Permet de passer de perso->getDegats() (qui est en réalité : perso->getDegats->armedegats (*))
              à perso->getDegats().

              (*) je veux dire par la que la méthode getDegats va utiliser une autre méthode pour chercher les degats de l'arme et les retourner.

              Enfin ton illustration et la mienne ont une grande différence : je n'ai pas pensé à mettre l'objet arme en dehors de perso...
              • Partager sur Facebook
              • Partager sur Twitter
                15 septembre 2007 à 23:30:12

                Excusez moi mais je n'ai pas vue dans le cour "l'héritage" qu'es ce ?

                J'explique mon principe.

                Mon frére qui travaille à l'IUT informatique à Aix en provence m'a dit, ne met jamais de "cout<<" dans les methodes c'est de mon prof de C++ qui me l'as dit.

                Alors j'ai crée une variable String qui demande de récpéré comme valeur les donné du perso, donc la methode de la classe personnage donne dans se qu'il renvoit toute les informations(affichage). Le probléme c'est qu'avec 2 classe j'ai fais(pour simplifier une fonction qui prend les donné de la classe Personnage, et de la classe arme.

                Excusez moi si je me fais pas trés bien comprendre mais j'ai vraiment beaucoup bue.. Enfaite je suis casi ivre..
                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2007 à 0:06:46

                  DJ-JB j'ai rien compris a ce que tu nous a raconter :p
                  A part que tu dis que les cout dans les méthodes cay mal, je vois pas trop pourquoi...
                  Hiura tu n'aurais pas fait une erreur en écrivant ?
                  perso->getDegats() = perso->getDegats()...

                  Mon illustration était un exemple mais je précise que je la trouve moi même obsolète, puisque l'on peut faire perso->getDegats(), qui revient à perso->arme->m_degats. C'est peut être ce que tu voulais dire, j'ai pas tout compris alors :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 septembre 2007 à 1:32:56

                    DJ-JB le prof de ton frère dit des choses parfaitement sensées. Il convient de séparer le code "métier" des affichages. ceci dit, il est acceptable de laisser des traces temporaires en vu de faciliter le debug.


                    Une meilleure (elle est encore très loin de la perfection) modélisation cacherait même la notion d'arme. A la place le perso attaquerait un autre. C'est le perso qui attaque qui décide de l'arme, l'arme qui détermine les dégats à encaisser et leur nature. Quant à l'attaqué, en fonction de ses protections et autres immunitées courantes encaissera des dégats typés.

                    Aucune indirection à 15 niveaux de profondeur, aucun accès aux éléments internes, aucun accesseur. Juste de la POO.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                    Anonyme
                      16 septembre 2007 à 10:32:18

                      Citation : lmghs


                      Une meilleure (elle est encore très loin de la perfection) modélisation cacherait même la notion d'arme.



                      Ben voilà qqn qui sais mieux s'exprimer que moi. ;) (même à 1.30 :-° )
                      En gros c'est ce que je voulais dire.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 septembre 2007 à 13:03:31

                        Ah ok, maintenant que j'ai le cerveau moins fatiguer je comprend mieux :p
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 septembre 2007 à 14:28:14

                          Se n'est pas le cas de tout le monde.. :-°


                          `Equipement*Personnage::m_equipement' is private

                          Main.cpp:
                          1. affichage = Perso.m_equipement->setAffichage(affichage);


                          Personnage.cpp:

                          1. m_equipement = new Equipement();


                          Personnage.h:

                          1. Equipement *m_equipement;
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            16 septembre 2007 à 16:22:38

                            Rajoute une fonction membre à la classe de l'objet Perso qui permet de modifier m_equipement.

                            Comme ça tu ferra ça dans ton main : Perso.SetAffichage(affichage);

                            PS : je ne comprends pas le affichage = Per... (elle te sert à quoi cette variable affichage?) Tu modifies l'affichage et en même temps tu récupère qqch... Pas logique à mon avis.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 septembre 2007 à 20:19:36

                              Le "cout<<" se trouve dans le main. Donc la methode met dans la variable tout l'affichage. Deplus je dois convertire aussi les valeurs des variable "force", "dexterité" etc.. qui sont de type main. ^^

                              Mais j'ai fais se que tu m'as dis et sa veut bien compiler mais voilà que mon programme s'arrête dés que je demande l'etat.

                              Telecharger le projet

                              Allez dans le menu Combat! Ensuite demandé l'affichage de l'etat du personnage vous allez voir le jeux se bloqué et s'arrêter.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 septembre 2007 à 21:29:44

                                Petite précision : si tu veux absolument acceder aux dégats de l'arme, tu peux faire :

                                1. int main()
                                2. {
                                3.       // Création dynamique de ton perso, qui crée dynamiquement son arme
                                4.       int degatsArme = Perso->getArme()->getDegats();
                                5.       // Reste du code
                                6. }


                                Ça évite de créer plein de méthodes et/ou de pointeurs juste pour y acceder.


                                Et pour ton problème de "`Equipement*Personnage::m_equipement' is private " c'est juste que t'as pas le droit d'acceder comme ça à l'arme du perso, tu dois créer une méthode qui te renvoie l'arme :

                                1. affichage = Perso.getEquipement()->setAffichage(affichage);



                                Et sinon pour le fait que ça bloque au moment d'afficher l'était, je peux pas trop te dire, je trouve ton code très mal organisé :(
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 septembre 2007 à 15:36:25

                                  C'est le premier concept de la POO : l'encapsulation, chaque classe conserve ses données scrupuleusement en abstraction de son utilisation.

                                  Pour ce qui est de l'affichage si c'est le nombre de dégat que tu veux savoir pourquoi ne retourne tu pas seulement un int contenant la force de l'attaque

                                  tu aurais une fonction du genre :
                                  1. class Personnage
                                  2. {
                                  3.     //...
                                  4. public:
                                  5.     //...
                                  6.     // attaquer
                                  7.     // Le Personnage en attaque un autre
                                  8.     // INTRANTS : const Personnage & (l'autre personnage
                                  9.     // EXTRANTS : int (points de vie perdu par l'autre personnage)
                                  10.     int attaquer( Personnage & autre );
                                  11. };


                                  Je te laisse imaginer l'implémentation mais attention :
                                  ! pas d'affichage,
                                  ! pas d'accès aux membres privés de l'"autre" personnage,
                                  ! les points de vies ne doivent pas être enlevé à l'autre personnage (c'est à lui de s'en charger).

                                  P.S. le "Personnage &" c'est une référence, un peu comme un pointeur à la différence qu'elle s'utilise à la manière d'une variable statique et qu'on ne peux modifier l'espace mémoire "pointée"... Donc l'instance de Personnage passée en paramètre sera modifiée dans la fonction appelante.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 septembre 2007 à 21:39:13

                                    Arf merçi j'ai réussi à compiler mais je n'arrive pas a trouver dans vos réponse le pourquoi du bloquage !

                                    Merci comme même pour m'avoir aider pour ma premiére problématique.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Les classes secondaire

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown