Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C++] Quelques questions

utilisateur confirmé

Sujet résolu
    9 août 2006 à 2:02:06

    Salut à tous, vous m'avez peut être croisé parci parlà au détour du forum, et me voila a poster quelques question concernant le C++. Ca fait un petit temps que j'ai repris mon langage de programmation préféré et je mange pour l'instant toute la doc que je trouve sur l'héritage et le polymorphisme et je ne pige pas grand chose pour le moment mais ça va venir. En attendant j'ai quand même quelque questions.

    Est ce que l'on peut apeller automatiquement une méthode définie pour chaque classe définie ?


    par exemple


    class Maclasse
    {
       public :
       void MaMethode();
    };

    Maclasse ClasseUn;
    Maclasse ClasseDeux;

    // Et faire quelque chose a la place de
    ClasseUn->MaMethode();
    ClasseDeux->MaMethode();

    // genre toutelesclasses->MaMethode();




    Ensuite comment est-il possible de donner une notion parent enfant? Ca voudrait dire de mettre une classe en tant que variable et d'utiliser les méthodes de cette-dite classe.


    comme par exemple on peut trouver dans le sdk de HL et HL2
    tatatavguitextemesouvientplus(texte, parent);//Parent étant la classe ou cette méthode prendra les variables dont a besion l'objet texte;



    Quelqu'un peut-il m'expliquer clairement et brèvement la nition de polymorphisme ou bien me donner un lien clairement documenté? Chaque page de google me donne des cours incomplet ou incomprehensibles.




    Voila, c'est tout pour le moment, je vous remercie d'avance pour votre attention.


    Satan2k (qui traine de temps en temps ;) )
    • Partager sur Facebook
    • Partager sur Twitter
      9 août 2006 à 2:33:13

      Pour ta première question:
      (un exemple vaut mieux qu'un long discours) .


      #include <stdio.h>
      #include <vector>

      class RootClass
      {
          public:
          RootClass()
          {
              m_instances.push_back(dynamic_cast<RootClass *>(this));
          }

          virtual ~RootClass()
          {
              std::vector<RootClass *>::iterator it=RootClass::m_instances.begin();
              RootClass *this_obj=dynamic_cast<RootClass *>(this);

              while(it!=RootClass::m_instances.end())
              {
                  if((*it)==this_obj)
                  {
                      RootClass::m_instances.erase(it);
                      break;
                  }
                  it++;
              }
          }

          static void CallAllMyMethod()
          {
              std::vector<RootClass *>::iterator it=RootClass::m_instances.begin();

              while(it!=RootClass::m_instances.end())
              {
                  (*it)->MyMethod();
                  it++;
              }
          }

          virtual void MyMethod() = 0;

          protected:
          static std::vector<RootClass *> m_instances;
      };

      std::vector<RootClass *> RootClass::m_instances=std::vector<RootClass *>();

      /*
       *
       *
       *
       */

      class Test1 : public RootClass
      {
          public:
          virtual void MyMethod(){printf("Test1::MyMethod\n");}
      };

      class Test2 : public RootClass
      {
          public:
          virtual void MyMethod(){printf("Test2::MyMethod\n");}
      };

      class Test3 : public RootClass
      {
          public:
          virtual void MyMethod(){printf("Test3::MyMethod\n");}
      };

      class Test4 : public Test1
      {
          public:
          virtual void MyMethod(){printf("Test4::MyMethod\n");}
      };

      class Test5 : public Test4, public Test2
      {
          public:
          virtual void MyMethod(){printf("Test5::MyMethod\n");}
      };

      int main(int argc,char **argv)
      {
          Test1 t;
          Test2 t2;
          Test3 t3;
          Test4 t4;
          Test5 t5;

          printf("===\n");
          RootClass::CallAllMyMethod();

          {
              Test1 tbis;

              printf("===\n");
              RootClass::CallAllMyMethod();
          }

          printf("===\n");
          RootClass::CallAllMyMethod();

          getchar();

          return 0;
      }



      Pour l'autre, j'ai pas compris .
      • Partager sur Facebook
      • Partager sur Twitter
        9 août 2006 à 3:03:12

        Merci pour ta répone c'est vraiment très enrichissant ;)

        Il n'existe cependant pas un moyen plus court?

        Sinon concernant la deuxieme question. Par exemple dans ce que je veux faire j'ai une classe qui s'occupe a faire une fenetre avec couleur, position x et y et taille. Je voudrais qu'une classe texte puisse être liée à la fenetre et puisse prendre des attribus de la classe de base.


        Par exemple j'ai

        //attention ce code ne se compilera pas
        CGuiScreen fenetre(rouge,vert,bleu,longueur,largeur,x,y);
        //Mettons que il y aie des attributs x et y qui prenent les valeurs des parametre x et y du constructeur je voudrais via le constructeur du texte, qu'il puisse prendre les valeurs de fenetre.x et de fenetre.y en mettant simplement quelque chose comme ceci
        CGuiTexte texte(fenetre,texte,police,rouge,vert,bleu,xrelatif,yrelatif);
        //fenetre etant parent, le constructeur va automatiquement chercher les valeurs des attributs de fenetre et pas d'une autre classe


        En tout cas merci pour cette réponse ;)
        • Partager sur Facebook
        • Partager sur Twitter
          9 août 2006 à 9:39:08

          Salut,

          Rien n'empêche de passer un objet en paramètre (ou plutôt une référence à cet objet). Tu pourras ainsi en utiliser les méthodes publiques.

          L'autre moyen est d'utiliser le mot clé friend qui permet aux objets d'avoir accès aux membres privés d'une classe.

          Pour le polymorphisme, j'ai écrit plusieurs articles. Ils sont peut être incomplets et/ou incompréhensibles, je te laisse juger:
          Sommmaire: http://www.xgarreau.org/aide/devel/cpp/

          Et notamment:
          Héritage 1: http://www.xgarreau.org/aide/devel/cpp/no_4.php
          Héritage 2 (polymorphisme): http://www.xgarreau.org/aide/devel/cpp/no_5.php
          Mot clé friend : http://www.xgarreau.org/aide/devel/cpp/no_6.php
          Glossaire (avec exemples) : http://www.xgarreau.org/aide/devel/cpp/no_9.php

          Valà,
          a+
          • Partager sur Facebook
          • Partager sur Twitter
            9 août 2006 à 10:52:11

            Non je ne vois pas plus court car nécessairement pour appeler toutes les méthodes, il faut connaître la liste des instances des classes qui t'intéressent .
            Mais on a alors un problème car il faut être sur que toutes les classes exportent bien cette méthode, ce qui ne peut-être sur que en héritant toutes tes classes d'une seule qui présente cette méthode .
            Au passage on la déclare virtuelle pure pour éviter que la classe de base soit instanciée .

            Ensuite vient le problème de gestion de la liste des instances . Le mieux c'est de gérer l'ajout et la suppression des instances dans le constructeur et le destructeur comme çà on est sûr que c'est fait automatiquement et pour TOUTES les classes .

            D'ailleurs je trouve que ce code est plutôt court et la contraite très faible: il suffit de spécifiée RootClass comme classe parente de toutes les classes qui t'intéressent .
            • Partager sur Facebook
            • Partager sur Twitter
              9 août 2006 à 10:53:30

              Citation : pamaury

              RootClass *this_obj=dynamic_cast<RootClass *>(this);

              o_O
              Il me semble que l'opérateur dynamic_cast<>() n'est pas utile ici, je me trompe ?
              • Partager sur Facebook
              • Partager sur Twitter
                9 août 2006 à 11:13:26

                un reinterpret_cast<>() pourrait suffit en effet .
                • Partager sur Facebook
                • Partager sur Twitter
                  9 août 2006 à 12:23:09

                  un grand merci je me suis inspiré de ton bout de code et ca fonctionne du tonnerre ;)

                  Sinon reste encore un probleme j'ai trouvé la "solution" à mon probleme d'attributs des classes en dormant (hé oui lol) mais il me reste encore quelques problemes d'acheminement de variables :D


                  EDIT : Solution trouvée avec pointeurs, mes textes collent parfaitement avec mes fenetres draggable SDL ;). Reste plus que la classe images, boutons et autre et j'aurai fini mon GUI personnel :D


                  EDIT2 :
                  J'ai un petit problème de mémoire, plus mes fonction de redraw de mes classes sont apellées plus ca rame Image utilisateur Quelqu'un a une idée?


                  EDIT3 : Trouvé -> un loadimage dans une boucle ca fait mal :s.... Tout fonctionne je post problème répondu.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [C++] Quelques questions

                  × 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