Partage
  • Partager sur Facebook
  • Partager sur Twitter

petit souci avec les classes

    14 mars 2008 à 21:38:30

    Bonsoir ,
    ayant lu presque la totalite des chapitres C++ de mateo21 (il me reste les deux derniers) j'ai voulu m'entrainer un peu en creant un pseudonyme de la classe string que j'ai appele Sing .
    pour l'instant j'ai surcharge juste l'operateur + et l'operateur = et sa ne marche pas :( .
    sa compile avec VS mais pas avec CB . je ne sais pas ou j'ai pu me tromper sachant que VS me sort une ligne vide o_O .
    voila le code
    1. #include<iostream>
    2. #include<string.h>
    3. using namespace std;
    4. class Sing
    5. {
    6. public:
    7.         Sing();
    8.         Sing(char *ch);
    9.         Sing(Sing &copie);
    10.         ~Sing();
    11.         int longueur(){ return len; }
    12.         char* lire();
    13.         Sing operator+(Sing &copie);
    14.         Sing operator=(Sing &copie);
    15. private:
    16.         char *chaine;
    17.         int len;
    18. };
    19. Sing Sing::operator=(Sing &copie)
    20. {
    21.     int l=strlen(copie.chaine);
    22.     char *ch=new char[l+1];
    23.     strcpy(ch,copie.chaine);
    24.     Sing objet(ch);
    25.     return objet;
    26. }
    27. Sing::Sing()
    28. {
    29.         chaine= new char[1];
    30.         chaine[0] = '\0';
    31.         len = 0;
    32. }
    33. Sing ::Sing(char *ch)
    34. {
    35.         int l=strlen(ch);
    36.         chaine = new char[l+1];
    37.         strcpy(chaine,ch);
    38.         len=l;
    39. }
    40. Sing::Sing(Sing &copie)
    41. {
    42.     char *ch = new char[copie.len +1 ];
    43.         strcpy(ch,copie.chaine);
    44.         chaine=ch;
    45.         len=copie.len;
    46. }
    47. Sing::~Sing()
    48. {
    49.         delete [] chaine;
    50.         len=0;
    51. }
    52. char* Sing::lire()
    53. {
    54.         return chaine;
    55. }
    56. Sing Sing::operator+(Sing &copie)
    57. {
    58.         int a=len+copie.len , compt=0,j=0;
    59.         char *ch=new char[a+1];
    60.         for(int i=0;i<len;i++)
    61.     {    ch[i]=chaine[i];
    62.         compt=i;
    63.     }
    64.     for(int i=compt;i<a;i++)
    65.     {   ch[i]=copie.chaine[j];
    66.         j++;
    67.     }
    68.     ch[a]='\0';
    69.         Sing objet(ch);
    70.         return objet;
    71. }
    72. int main()
    73. {   Sing ch1("ayoub"),ch2("anas");
    74.         Sing  ch3;
    75.         ch3=(ch2+ch1);
    76.         cout<<ch3.lire()<<endl;
    77.         system("PAUSE");
    78.         EXIT_SUCCESS;
    79. }


    je precise que quand je compile avec VS il me sort une ligne vide .
    merci pour votre aide ,j'espere que vous allez trouver ou se situe le probleme .
    • Partager sur Facebook
    • Partager sur Twitter
      14 mars 2008 à 22:33:39

      montre nous tes erreur que code block te dis
      • Partager sur Facebook
      • Partager sur Twitter
      :)
        15 mars 2008 à 2:58:15

        Code::block me dit
        83 error : no match for 'operator=' in 'ch3=Sing::operator+(Sing&)((Sing&))(&ch2))'
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 mars 2008 à 10:11:03

          ch2+ch1 renvoit un objet temporaire.
          Ton operator= attend une référence.

          Le seul moyen de passer un objet tmporaire via une référence c'est avec une référence constante.Donc Sing operator=(const Sing& copie);

          Il en va de même pour operator+.

          Mis à part, il manque plein de const, ton algo est faux, ...

          Edit: Ce code compile mais reste faux.
          1. #include<iostream>
          2. #include<string.h>
          3. using namespace std;
          4. class Sing
          5. {
          6. public:
          7.         Sing();
          8.         Sing(char *ch);
          9.         Sing(const Sing &copie);
          10.         ~Sing();
          11.         int longueur(){ return len; }
          12.         char* lire();
          13.         Sing operator+(const Sing &copie);
          14.         Sing& operator=(const Sing &copie);
          15. private:
          16.         char *chaine;
          17.         int len;
          18. };
          19. Sing& Sing::operator=(const Sing &copie)
          20. {
          21.     int l=strlen(copie.chaine);
          22.     delete [] chaine;
          23.     chaine=new char[l+1];
          24.     strcpy(chaine,copie.chaine);
          25.     return *this;
          26. }
          27. Sing::Sing()
          28. {
          29.         chaine= new char[1];
          30.         chaine[0] = '\0';
          31.         len = 0;
          32. }
          33. Sing ::Sing(char *ch)
          34. {
          35.         int l=strlen(ch);
          36.         chaine = new char[l+1];
          37.         strcpy(chaine,ch);
          38.         len=l;
          39. }
          40. Sing::Sing(const Sing &copie)
          41. {
          42.     char *ch = new char[copie.len +1 ];
          43.         strcpy(ch,copie.chaine);
          44.         chaine=ch;
          45.         len=copie.len;
          46. }
          47. Sing::~Sing()
          48. {
          49.         delete [] chaine;
          50.         len=0;
          51. }
          52. char* Sing::lire()
          53. {
          54.         return chaine;
          55. }
          56. Sing Sing::operator+(const Sing &copie)
          57. {
          58.         int a=len+copie.len , compt=0,j=0;
          59.         char *ch=new char[a+1];
          60.         for(int i=0;i<len;i++)
          61.     {    ch[i]=chaine[i];
          62.         compt=i;
          63.     }
          64.     for(int i=compt;i<a;i++)
          65.     {   ch[i]=copie.chaine[j];
          66.         j++;
          67.     }
          68.     ch[a]='\0';
          69.         Sing objet(ch);
          70.         return objet;
          71. }
          72. int main()
          73. {   Sing ch1("ayoub"),ch2("anas");
          74.          Sing  ch3;
          75.         ch3=(ch2+ch1);
          76.         cout<<ch3.lire()<<endl;
          77.         system("PAUSE");
          78.         EXIT_SUCCESS;
          79. }
          • Partager sur Facebook
          • Partager sur Twitter
            15 mars 2008 à 16:20:42

            c'est faux parceque il manque plein de constantes ou bien c'est l'algo qui est faux ??

            a ce que je sache c'est pas oblige de mettre le mot
            1. const
            si ?
            le most const existe juste par precaution pour que la fonction ne change aucune valeur corrigez moi si j'ai faux .
            • Partager sur Facebook
            • Partager sur Twitter
              15 mars 2008 à 18:14:36

              Tu as faux. Cf la petite phrase de david au sujet des temporaires.

              @david,
              - le char*, il le faut const aussi.
              - pour l'affectation, il faut allouer avant de libérer
              - lire() brise l'encapsulation => aucun intérêt
              - la concaténation est plus simple en libre -- cf l'autre fil sur exactement le même sujet
              • 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.
                16 mars 2008 à 12:30:39

                Il y a autre chose, dans le main (même si ça ne répond pas à ton problème) ligne : 90, faut mettre return EXIT_SUCCESS; et non EXIT_SUCCESS seule !
                Ciao
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  16 mars 2008 à 17:30:00

                  lmghs >> Je connaissais une partie de ces remarques, mais il en voulait qu'un code qui compile, ce que je lui ai fournit.Car oui lmghs, je sais que le code que j'ai donné est bien naze et tu te doute que je n'écrirais pas ça, enfin du moins pas comme ca.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  petit souci avec les classes

                  × 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