IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

question sur les opérateurs


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut question sur les opérateurs
    bonjour

    je fais un programme sous visual c++ 6.0 et j'obtiens des messages d'errors.
    j'avais un problème d'opérateurs.

    pourriez vous m'aider pour le programme suivant svp?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <string.h> // strcpy(); strlen();
    #include <conio.h> // getch();
    #include <iostream> // cout et cin
    using namespace std;
     
    class String
    {
    // private :
        int nbr;
        char *ptr;
    public:
        String (char[]);
        String (char);
        ~String();
        String& operator=(const String &);
        String(const String &);
      /*  String plus (const String &); */
        String operator+(char);
    };                                   
     
    String String::operator+(char c)
    {
        char*chaine=new char[nbr+1];
        for(int i=0;i<nbr-1;i++)
            chaine[i]=ptr[i];
        chaine[nbr-1]=c;
        chaine[nbr]='\0';
        String resultat(chaine);
        delete chaine;
        return(resultat);
    }
     
    void main ()
    {
        String s1("azerty"),s2('q');
     
        String s3=s1+s2; // erreur ici
     
       /* s3=s1+'w'; cette ligne là fonctionne*/
        getch(); 
    }
    l'erreur du compilateur est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    error C2679: binary '+' : no operator defined which takes a right-hand operand of type 'class String' (or there is no acceptable conversion)
     
    error C2512: 'String' : no appropriate default constructor available
    ce sont les 2 erreurs et normalement on dit bien s1+s2 qui vont donner un nouveau String s3.

    Si j'essaye avec devc++, il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     no match for 'operator+' in 's1 + s2' 
     candidates are: String String::operator+(char)
    Comme ça marche avec s1+'w' donc l'opérateur "+" fonctionne, de là s1+s2 devrait marcher
    ptet que ça ne marche pas parce que s2 est un objet ayant 'w' et non un caractère mais alors comment modifier la fonction operator+ pour que ça marche aussi avec +s2 et aussi avec +'w' ?

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut Re: question sur les opérateurs
    Quelques erreurs en vrac, je n'ai lu qu'en diagonale.

    Citation Envoyé par isidore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    String String::operator+(char c)
    {
        char*chaine=new char[nbr+1];
        for(int i=0;i<nbr-1;i++)
            chaine[i]=ptr[i];
        chaine[nbr-1]=c;
        chaine[nbr]='\0';
        String resultat(chaine);
        delete chaine;
    Attention : Si on utilise new ...[...], il faut utiliser delete []...
    Citation Envoyé par isidore
    Là, tu définis juste comment ajouter 1 caractère à une chaîne.
    Citation Envoyé par isidore
    int main()
    Citation Envoyé par isidore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
        String s1("azerty"),s2('q');
     
        String s3=s1+s2; // erreur ici
    Là, tu essayes d'ajouter une chaîne à une chaîne.

    Pour que ça marche, il faut :
    - Soit qu'il existe un opérateur qui sache ajouter une chaîne à une chaîne, comme celui que tu as mis en commentaire. Ici, décommenter cet opérateur et l'implémenter est la vraie solution.
    - Soit qu'il existe pour le compilateur un moyen de caster une chaîne en une lettre, ce qui n'aurait pas de sens.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char*chaine=new char[nbr+1];
    Attention : Si on utilise new ...[...], il faut utiliser delete []...
    ==> ben j'ai mis "delete chaine" , c pas suffisant?
    et je dois ajouter "delete char" ? ou ajouter "delete char[]" ?


    Ici, décommenter cet opérateur et l'implémenter est la vraie solution.
    -> que veut dire implémenter?
    comment faire pour que le compilo comprenne le "+s2" en +'q' ?

    Merci

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    Citation Envoyé par isidore
    Attention : Si on utilise new ...[...], il faut utiliser delete []...
    ==> ben j'ai mis "delete chaine" , c pas suffisant?
    et je dois ajouter "delete char" ? ou ajouter "delete char[]" ?
    relis attentivement le post de Jolyloic. il te dit de mettre "delete[] chaine;"
    delete char et delete char[] ça veut rien dire puisque char n'est pas une variable, mais un type de donnée.

    Citation Envoyé par isidore
    -> que veut dire implémenter?
    ça veut dire coder, écrire le code, programmer. tes prof d'infos doivent utiliser ce terme un peu tout le temps.

    Citation Envoyé par isidore
    comment faire pour que le compilo comprenne le "+s2" en +'q' ?
    là encore Jolyloic te l'a expliqué. tu as fait un opérateur qui additionne un String et un char, mais tu n'as pas fait d'opérateur capable d'additionner deux String. il faut aussi implémenter l'operateur "String operator+(String)"

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    relis attentivement le post de Jolyloic. il te dit de mettre "delete[] chaine;"
    je viens de trouver dans la faq http://c.developpez.com/faq/cpp/?pag...EURS_new_array
    (c comme tu as dit )

    mais tu n'as pas fait d'opérateur capable d'additionner deux String. il faut aussi implémenter l'operateur "String operator+(String)"
    -> je crois que c pareil, j'avais une fonction capable d'additioner 2 string, je l'ai renommé par "operator+" et ça marche.

    (heureusement que je l'avais la fonction )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String String::operator+(const String &s)
    {
        int i;
        char *chaine = new char[nbr+s.nbr-1];
        for(i=0;i<nbr-1;i++)     // strcpy(chaine,ptr);
            chaine[i]=ptr[i];        // copier 2 chaines de caractères
        for(i=nbr-1;i<nbr+s.nbr-1;i++)    // strcat(chaine,s.ptr);
            chaine[i]=s.ptr[i-nbr+1];     // concaténer 2 chaines de caractères  
        String resultat(chaine);
        delete[] chaine;
        return (resultat); 
    }
    Merci JolyLoic et bigboomshakala

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    c'est à chaque fois que y a un new qqch que je dois faire un delete[] ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    String::String(char ch[])
    {
        nbr=strlen(ch)+1;
        ptr=new char [nbr];
            for (int i=0;i<nbr;i++) // <=> strcpy(ptr,ch);
            ptr[i]=ch[i];  
    }
     
    String::String(char c)
    {
        nbr=2;
        ptr=new char[nbr];
        ptr[0]=c;
        ptr[1]='\0';    
    }
    Dans ces 2 fonction je dois mettre un delete[] ? je veux dire par là que c'est SYSTEMATIQUE , un truc pour la sécurité de la mémoire dynamique? ou c à voir au cas par cas?

    Ensuite j'ai lu dans la FAQ :
    "delete [] se charge d'appeler le destructeur de chaque objet du tableau."
    donc dans le destructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String::~String()
    {
        delete ptr;     
    }
    là je met juste "delete ptr" parce qu'on delete un pointeur sur un caractère et non un tablo de caractères (et il n'y a pas "new" en plus) , c bien cela?

    merci

  7. #7
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    il nef aut pas mettre de delete chaque fois qu'il y a un new, mais chaque fois qu'un pointeur n'est plus utilisé afin de libérer la mémoire.

    ptr est un attribut de la classe String. tu alloues a mémoire (new) dans les constructeurs, tu désalloues (delete) dans le destructeur, car c'est à la destruction de l'objet que ses attributs n'ont plus d'utilité.

    si le pointeur pointe un objet (cas de "new Objet(...)"), alors on fait "delete pointeur".
    si le pointeur pointe un tableau d'objet (cas de "new Objet[taille]"), alors on fait "delete[] pointeur".

    dans le 1er cas, ça supprime l'objet, dans le 2è ça supprime tous les objets du tableau (même si le tableau ne contient qu'une seul objet)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    salut

    merci pour les explications.
    pour comprendre toute la "théorie", revenons au concret :

    - Dans les 2 premières fonctions, je crée des tableau dont je vais en avoir besoin plus tard donc je ne dois pas perdre les pointeurs sur les zones mémoires donc je ne met pas de delete.

    - Dans le destructeur, je détruit qu'un objet donc c bien delete ptr et non delete[] ptr


    c bien cela?

    merci d'avance

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    tu as du écrire 'ptr = new char[unEntier]' quelquepart, puisque 'ptr' pointe sur un tableau de caractères (puisque tu fais 'ptr[index]').

    donc tu dois faire 'delete[] ptr' dans le constructeur.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    donc tu dois faire 'delete[] ptr' dans le constructeur.

    -> le destructeur tu voulais dire

    (j'ai vérifié de tte façon, delete dans le destructeur et le programme n'affiche plus rien, delete[] dans le destructeur et c bon)



    ps : merci pour ta patience ^_^

  11. #11
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par isidore
    -> le destructeur tu voulais dire
    oui destructeur. (v me coucher moi, parce que là ça va plus)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo