Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme d'instance

POO

    20 août 2007 à 9:31:52

    Bonjour Chers Zéros,
    Je viens pour la première fois vous demander de l'aide en tant que "débutant" dans le C++.
    J'ai cherché un peu mais je n'ai pas trouvé de topic parlant de ce sujet.
    Je suis en train de créé un programme, un daemon(ou démon), sur lequel je ne vais pas tout vous expliquer/raconter car ce n'est pas le but de ce sujet.
    Je vais plutot me fixer sur mon problème.

    Il me faudrait pouvoir créé un nombre inconnu d'instances. En effet, je ne sais pas a la compilation combien d'instance mes classes devront gérer.
    Il Faudrait que mon programme puisse en créé en cours d'execution. Je pense que c'est un problème courant mais je n'y ai pas trouvé de solution.

    On m'a conseillé un tableau avec une fonction pour créer un nouveau joueur mais meme avec ca je n'ai pas su comment faire.

    J'implore donc votre aide.
    Demandez si mon message manque d'informations.
    • Partager sur Facebook
    • Partager sur Twitter
      20 août 2007 à 9:35:12

      Tableau dynamique:

      1. ma_classe* tab = new ma_classe[n];  // avec n variable que tu définis a l'execution.
      2. ...
      3. delete [] tab;  // pour effacer


      cela te permet de créer, sur demande un tableau d'éléments dont la taille n'est pas fixée a la compilation.

      1. std::vector<ma_classe> tab;  // vector.


      technique STL : puissant et élégant.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        20 août 2007 à 9:41:57

        Je plussoie l'utilisation des conteneurs de la STL
        • Partager sur Facebook
        • Partager sur Twitter
        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          20 août 2007 à 9:55:30

          Merci de ta réponse explicative Fvirtman.

          Peux-tu m'en dire plus nanoc?
          • Partager sur Facebook
          • Partager sur Twitter
            20 août 2007 à 10:06:17

            Plutôt que d'utiliser les tableaux dynamiques "faits à la main" comme dans le 1er exemple de Fvirtman, je propose d'utiliser les tableaux dynamiques de la librairie standard.

            En particulier le template vector qui se prète bien à ce que tu veux faire.

            1. #include <vector>
            2. std::vector<monTypeDObjet> monTableau;  //creation du tableau
            3. monTableau.push_back(new monObjet);     //Ajout d'un element au tableau
            4. //...


            Pour plus de détails essaye www.cplusplus.com (en anglais)
            • Partager sur Facebook
            • Partager sur Twitter
            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              20 août 2007 à 10:15:23

              Pour ce qui est de monTableau et monObjet j'ai compris mais qu'est donc monTypeDOBJET?
              Qu'est ce que cela représente? Désolé je ne suis pas un connaisseur des ecriture traditionnelle.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                20 août 2007 à 10:24:38

                Nanoc, le code que tu as donnée en exemple me semble bizarre :euh: .
                Déjà, tu déclares un vector de monTypeDObjet, puis tu remplis ce vector avec des monObjet*... Plutôt:

                1. #include <vector>
                2. std::vector<monType*> tab;
                3. tab.push_back(new monType);


                Si tu utilises les pointeurs comme cela, il faut aussi penser à libérer ce que tu as alloué:

                1. for(std::vector<monType*>::iterator it = tab.begin() ; it != tab.end() ; it++)
                2.     delete *it;
                3. tab.clear();
                • Partager sur Facebook
                • Partager sur Twitter
                  20 août 2007 à 10:31:08

                  Attention avec std::vector<truc>, des instances de truc seront recopiées lors de certains push_back, lorsque la fin de réserve sera atteinte, et qu'il faudra faire un réalloc.
                  - bien penser a avoir un constructeur par recopie fiable (sauf si toutes les données membres sont statiques, alors ça se fait tout seul)
                  - eviter de faire des vector de classes trop lourdes : la recopie peut etre couteuse.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                    20 août 2007 à 10:43:45

                    je vais d'abord m'en tenir a une création suppression car je susi en train d'apprendre et ca va m'embrouiller...
                    Je ferais la réalloc apres.
                    En adaptant le code de Cyprien_ j'ai une erreur, l'ai je mal utilisé?

                    1. vector<Joueur> Tab;  //creation du tableau
                    2.         Tab.push_back(new Joueur);     //Ajout d'un element au tableau
                    3.         for(std::vector<Joueur*>::iterator it = Tab.begin() ; it != Tab.end() ; it++) {
                    4.         delete *it;
                    5.         Tab.clear(); }


                    Le message d'erreur est :

                    /.../main.cpp:: In function «int main()":
                    /.../main.cpp:13: erreur: no matching function for call to «std::vector<Joueur, std::allocator<Joueur> >::push_back(Joueur*)"
                    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:602: note: candidats sont: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Joueur, _Alloc = std::allocator<Joueur>]
                    /.../main.cpp:14: erreur: conversion from «__gnu_cxx::__normal_iterator<Joueur*, std::vector<Joueur, std::allocator<Joueur> > >" to non-scalar type «__gnu_cxx::__normal_iterator<Joueur**, std::vector<Joueur*, std::allocator<Joueur*> > >" requested
                    /.../main.cpp:14: erreur: no match for «operator!=" in «it != Tab. std::vector<_Tp, _Alloc>::end [with _Tp = Joueur, _Alloc = std::allocator<Joueur>]()"
                    :: === Build finished: 4 errors, 0 warnings ===

                    Pour informations, j'utilise Code:Blocks et je suis sous Kubuntu Feisty(Linux)

                    PS: J'ai supprimé l'arborescence dans les message d'erreur.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      20 août 2007 à 10:46:36

                      Première ligne:

                      1. vector<Joueur> Tab;


                      Tu as créé un vector de Joueur, alors que tu veux un vector de Joueur* (il manque une * quoi ^^ ).

                      Pour la réallocation dont parlait Fvirtman, tu n'as pas à t'en soucier, c'est la classe std::vector qui s'en occupe de façon transparente pour l'utilisateur ;) .

                      EDIT: encore une chose, le Tab.clear() est fait en-dehors de la boucle for. Il sert en fait à effacer tous les éléments du tableau.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 août 2007 à 10:53:13

                        Merci, je préfère quand la boucle est fermé sinon comme les boucle se chevauche souvent ca créé des bugs ou erreurs.

                        La compilation a réussi.
                        Mais je dois encore vérifier si tout fonctionne comme je veux ^^.

                        Edit: Résolu !!!

                        PS: Je dois attendre un post pour le marqué résolu, c'est bete...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 août 2007 à 21:28:42

                          regarde tout en bas, tu peux mettre en resolu
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 août 2007 à 21:41:23

                            J'ai en effet omis une *. Ce qui a porté à confusion les suivants.

                            Désolé.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.

                            Probleme d'instance

                            × 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