Partage
  • Partager sur Facebook
  • Partager sur Twitter

Surcharge opérateur [ ]

    28 mars 2008 à 20:53:58

    Bonsoir,

    Dans le cadre d'un TD, je dois surcharger l'opérateur [ ] dans une classe de chaine de caractères :
    1. class UneChaine {
    2. private :
    3.         int saTaille;
    4.         char *sesValeurs;
    5. public :
    6.         UneChaine(int telleTaille=TAILLE, char * tellesValeurs=" ");
    7.         UneChaine(char * tellesValeurs);
    8.         UneChaine(const UneChaine &telleChaine);
    9.         ~UneChaine(void);
    10.         int getsaTaille (void)const;
    11.         char* getsesValeurs(char* telTampon)const;
    12.         void afficheToi();
    13.         UneChaine & operator=(const UneChaine &telleChaine);
    14. }


    Cet opérateur doit pouvoir permettre de modifer un caractère dans la chaine (laChaine[5]="a";)

    J'avoue que je n'ai pas vraiment d'idée sur la réalisation, j'attend donc vos conseils :)

    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2008 à 21:01:09

      cette opérateur n'a pas plus de difficulté que les autres ;)

      1. uneChaine& operator[](int);
      2. //l'opérateur attend un int en parametre et et "modifie" l'objet appelé
      • Partager sur Facebook
      • Partager sur Twitter
        28 mars 2008 à 21:08:35

        C'était donc ça :p

        Merci ;)

        Nouvelle petite question ;) :

        Dans une classe j'ai crée une structure. Comment réaliser une méthode qui retourne un objet du type de ma structure
        (
        1. Tstruct MaClasse::MaMethode()
        ne marche pas)
        • Partager sur Facebook
        • Partager sur Twitter
          28 mars 2008 à 21:29:17

          pour revenir à op[](), il vaus mieux le definir en deux versions
          1. const char &operator[](size_t) const; // lecture
          2. char &operator[](size_t); // ecriture


          Citation : DarkGloom

          ans une classe j'ai crée une structure. Comment réaliser une méthode qui retourne un objet du type de ma structure
          (

          1. Tstruct MaClasse::MaMethode()

          ne marche pas)


          un peu plus d'info ne serait pas de refus
          • Partager sur Facebook
          • Partager sur Twitter
            28 mars 2008 à 21:51:55

            En fait je dois programme un tableau de caractères (oui mon prof a de sacrées idées...)
            J'ai utilisé pour ça une liste chainée

            1. private:
            2.         struct Tmaillon{
            3.                 int leNb;
            4.                 Tmaillon * leSuivant;
            5.         };
            6.         int NbElements;
            7.         Tmaillon * lePremier;
            8. public:
            9.         UnTableau();
            10.         ~UnTableau();
            11.         void ajouteCase(int telNb, int telIndice);
            12.         void afficheToi(void);
            13.         void ModifieCase(int telIndice, int telNb);


            et je voudrais créer une méthode trouve_maillon qui trouverait le maillon d'indice i.
            Mais d'ailleurs si quelqu'un a une meilleure idée pour programmer ça je suis preneur :)
            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2008 à 21:56:24

              Il me semble qu'utiliser une liste chainée pour représenter un tableau est un non-sens. De plus sur une liste chaînée, l'opération d'accés direct [] est extrêment couteuse.

              Un "simple" tableau me semblerait plus approprié.
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                28 mars 2008 à 21:57:59

                En même temps représenter un tableau par un tableau ça fait pas un peu foutage de gueule ? :p
                • Partager sur Facebook
                • Partager sur Twitter
                  28 mars 2008 à 22:17:41

                  Tu dis ça parce que tu n'as pas perçu la toute puissance du destructeur, et peut-être pas non plus les écueils des copies incomprises.
                  • 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.
                    28 mars 2008 à 22:29:18

                    Ton message s'adresse à moi Imghs ?

                    Si c'est le cas je ne le comprend pas, désolé.

                    Sinon pour une méthode qui retourne un objet de type struct, ya une possibilité ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 mars 2008 à 22:34:49

                      oui, il s'adresse à toi. pour t'aider, vas voir le TP : ZString
                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 mars 2008 à 22:44:02

                        Oui bien sûr que c'est faisable. Il "suffit" quelle soit copiable.
                        Mais sans plus d'infos à nous donner, tu es tout seul. ^^
                        • 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.
                          28 mars 2008 à 22:49:43

                          J'ai mis la définition de ma classe au dessus, c'est une bête liste chaînée et je veux créer une méthode trouve_maillon d'indice i (à la ième position) et qui retournerait un pointeur sur ce maillon.

                          Et pour répondre à Chlab on a programmé la classe string en cours, avec surcharge d'opérateurs et autre gaietés, mais string c'est plus qu'un tableau, alors qu'un bête tableau, le programme avec un tableau je ne vois pas l'intérêt. Mais bien sur je peux me tromper :euh:
                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 mars 2008 à 23:07:37

                            il me semble avoir lu dans "Le Langage C++" que std::string decoupais la chaine en plusieurs sous-chaine (mais je ne sais plus où), donc une classe String c'est une classe qui manipule un tableau en interne
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 mars 2008 à 23:15:53

                              Et ça plante à la compilation ou l'exécution ?
                              (en l'absence de constructeur de copie et d'opérateur d'affectation, je dirais "au moins exécution")

                              L'intérêt ? Le RAII!

                              Sinon, en effet, officiellement, std::string pourrait être implémentée comme une file de tableaux (aka std::deque), dans les faits, toutes les implémentations de std::string ont leurs éléments stockés de façon contiguë en mémoire. Et cet état de fait sera entériné dans le prochain standard -- comme ce fut le cas pour les vecteurs en 2003.
                              • 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.
                                28 mars 2008 à 23:21:31

                                Oui oui bien sur mais son utilisation est différente de celle du tableau.
                                Fin je sais pas si je suis clair dans ce que je veux dire, on se sert de tableau(x) pour créer des variables chaines de caractères, donc là pourquoi ne pas se servir d'une liste chainée pour créer des variables tableaux d'entiers (les tableaux n'existant d'ailleurs pas en C (en C++ aussi ?), ils doivent ressembler à quelque chose dans le genre non ?

                                Imghs > Rien ne plante, pour l'instant :p
                                Mais je n'ai pas finit de programmer ma classe, j'attends de pouvoir créer ces méthodes pour rendre les autres plus clair.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 mars 2008 à 23:36:27

                                  Citation : DarkGloom

                                  a- donc là pourquoi ne pas se servir d'une liste chainée pour créer des variables tableaux d'entiers
                                  b- (les tableaux n'existant d'ailleurs pas en C (en C++ aussi ?), ils doivent ressembler à quelque chose dans le genre non ?


                                  a- parce que c'est alors une liste et pas un tabelau ?
                                  liste : op[] en O(N) ; insert en O(1)
                                  tableau: op[] en O(1) ; insert en O(N)

                                  b- http://cpp.developpez.com/faq/cpp/?page=STL#STL_container
                                  • 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.
                                    29 mars 2008 à 3:22:47

                                    Citation : DarkGloom

                                    Fin je sais pas si je suis clair dans ce que je veux dire, on se sert de tableau(x) pour créer des variables chaines de caractères, donc là pourquoi ne pas se servir d'une liste chainée pour créer des variables tableaux d'entiers (les tableaux n'existant d'ailleurs pas en C (en C++ aussi ?), ils doivent ressembler à quelque chose dans le genre non ?



                                    De quoi tu parles : "Les tableaux n'existes pas en C" ?

                                    std::string c'est un tableau de char dynamique implémenté dans une classe parce que c'est simple, efficace et beaucoup plus sécuritaire que de manipuler des char[]. Il y a une raison pour laquelle on utilise des tableaux dans des string on li/ajoute/détruit/réécrit beaucoup plus souvent qu'on doit insérer quelque part au centre du tableau. Le seul intérêt d'utiliser une liste chaînée c'est lorsqu'on doit remplacé et insérer au milieu, comme lorsqu'on utilise des "format" de chaînes. Mais puisque les opérations de lecture aléatoire et de destruction complète et d'écriture complète sont souvent utilisé dans une string, la liste perd de son avantage!

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      29 mars 2008 à 9:16:45

                                      Quand je proposais de représenter un tableau par un tableau, je parlais implicitement de séquence. C'est-à-dire toutes les valuers l'une à coté de l'autre dans la mémoire et pas nimporte ou comme avec une liste.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.

                                      Surcharge opérateur [ ]

                                      × 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