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 :

erreur de compilation


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 157
    Points : 112
    Points
    112
    Par défaut erreur de compilation
    bonjour a vous,
    je suis encore avec ma class chaine
    je ne comprends pas pourquoi quand je met dans l'operator+
    const chaine &
    j'ai une erreur de compilation sans le const tout fonctionne


    1>chaine.cpp(30) : error C2662: 'chaine::getChaine' : cannot convert 'this' pointer from 'const chaine' to 'chaine &'

    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
     
    #ifndef _chaine_
    #define _chaine_
    #include <iostream>
    #include <cstring>
     
    using namespace std;
    class chaine
    {
    public:
     
    	chaine();
    	chaine(char c);
    	chaine (char * );
    	chaine& operator+(const chaine&);
    	char * getChaine(){return machaine ;}
    	int getSize(){return size;}
    private :
     
    	char * machaine;
    	int size;
     
    };
     
     
     
     
    #endif


    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
    #include "chaine.h"
     
    chaine::chaine()
    {
    	machaine = new char [1]; 
    	strcpy(machaine ,"\0");
    	size =0;
    }
     
    chaine::chaine(char * str)
    {
    	if(str)
    	{
    		size= strlen(str);
    		machaine = new char[size+1];
    		machaine = strcpy(machaine,str);
    	}
    	else
    		chaine();
     
    }
    chaine &chaine::operator +( const chaine & str)//const
    {
    	if (machaine)
    	{
    		char * temp = new char[size+= str.size+1];
     
    		temp = strcpy(temp,machaine );
    		delete [] machaine;
    		machaine = strcat(temp,str.getChaine());
     
    		return *this;
     
    	}
     
     
    }

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonsoir,
    Il faut avouer que le message d'erreur n'est pas très explicite.
    Par contre, le prototype de strcat est sans appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* strcat(char* _Dest, const char* _Source);
    getChaine() doit donc être une fonction constante. Ceci dit, autant implémenter les deux versions, constante et non-constante, comme ça le compilateur choisira automatiquement la bonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * getChaine(){return machaine ;}
    const char* getChaine()const{return machaine;}

  3. #3
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 157
    Points : 112
    Points
    112
    Par défaut
    Merci pour ta reponse,
    je vois ce que tu veux dire par getChaine doit renvoyer pour cependant il y a un truc que je ne comprends pas truc pourquoi le compilateur peut

    caster dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     const char* getChaine(){return machaine;}
    et ne peut le faire pour directement pour Merci

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ton problème n'est pas qu'il n'arrive pas à convertir de char* vers const char*.
    Dans ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine &chaine::operator +( const chaine & str)
    str est qualifié de const. Donc tu ne peux le modifier ni appeler d'autre méthode de str qui ne soit pas elle même const. D'où le besoin de faire un accesseur en const (comme montré par Arzar) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* getChaine()const{return machaine;}
    L'important ici étant le second const, qui s'applique à la méthode et pas celui de retour. Tu aurais bien pu écrire (quoi que conceptuellement ce serait une erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* getChaine()const{return machaine;}

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ta fonction operator+ devrait s'appeler operator+=.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 157
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Ton problème n'est pas qu'il n'arrive pas à convertir de char* vers const char*.
    Dans ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine &chaine::operator +( const chaine & str)
    str est qualifié de const. Donc tu ne peux le modifier ni appeler d'autre méthode de str qui ne soit pas elle même const. D'où le besoin de faire un accesseur en const (comme montré par Arzar) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* getChaine()const{return machaine;}
    L'important ici étant le second const, qui s'applique à la méthode et pas celui de retour. Tu aurais bien pu écrire (quoi que conceptuellement ce serait une erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* getChaine()const{return machaine;}
    merci pour ta reponse.
    j'ai encore des questions je croyais que lorsqu'on declare dans une fonction le parametre comme constant la fonction c'est pour proteger les données contenues dans ce parametre et il ne peut etre modifier par cette fonction.
    d'apres ce que tu viens de me dire lorsque c'est un objet il ne doit appeler que des methodes membre constantes.
    si je comprends bien le probleme est plus general et ne concerne pas strcat donc
    merci de m'eclairecire est ce que ce que vous dite a une relation qu'on est dans la declaration d'une classe

  7. #7
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MyClass::foo(const Bar& bar) const;
    Le 1er const, en tant que paramètre, permet d'éviter de modifier l'objet en paramètre (ici l'objet bar) tandis que le const de fin fin s'applique à la fonction. Il évite de modifier un membre de la class MyClass.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par mahboub Voir le message
    merci pour ta reponse.
    j'ai encore des questions je croyais que lorsqu'on declare dans une fonction le parametre comme constant la fonction c'est pour proteger les données contenues dans ce parametre et il ne peut etre modifier par cette fonction.
    d'apres ce que tu viens de me dire lorsque c'est un objet il ne doit appeler que des methodes membre constantes.
    si je comprends bien le probleme est plus general et ne concerne pas strcat donc
    merci de m'eclairecire est ce que ce que vous dite a une relation qu'on est dans la declaration d'une classe
    Comme l'a souligné Trunks, ce n'est pas tout à fait ce que j'ai voulu dire.
    Si on reprend ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine &chaine::operator +( const chaine & str)
    Le const s'applique au paramètre str et pas à this. Donc, pour str, tu ne peux appeler que des fonctions const et pour this tu peux appeler des fonctions const ou non const.
    D'ailleurs, tu pourrais faire :
    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
     
    chaine &chaine::operator +( const chaine & str)
    {
    	if (machaine)
    	{
    		char * temp = new char[size+= str.size+1];
     
    		temp = strcpy(temp,machaine );
    		delete [] machaine;
    		machaine  = temp;
    		machaine = strcat(
    			getChaine(), //(1)
    			str.getChaine()); //(2)
     
    		return *this;
     
    	}
       return *this;
    }
    Dans le cas (1), c'est la version non const qui est appelée sur l'objet this:
    Dans le cas (2), c'est la version const qui es appelée sur l'objet str :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * getChaine()const
    Pendant que j'y suis, quelque remarques sur ton code :
    1/Ne pas utiliser using namespace dans le .h. Tu peux le mettre dans le cpp, mais il quand même préférable de garder l'utilisation complète du namespace (std:: n'est pas trop long à écrire).
    2/ Tu n'as pas de destructeur pour libérer machaine
    3/ Tes allocations peuvent échouer. Et tu ne gère pas cet échec.
    4/ Dans ce constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    chaine::chaine(char * str) //(1)
    {
    	if(str)
    	{
    		size= strlen(str);
    		machaine = new char[size+1];
    		machaine = strcpy(machaine,str);
    	}
    	else
    		chaine();//(2)
     
    }
    (1) : tu pourrais passer un const char * au lieu d'un char * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine::chaine(const char * str)
    (2) : ceci n'appelle pas le constructeur par défaut sur this !!!!!! Cela crée une variable non nommée de type chaine. C'est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    chaine::chaine(char * str) 
    {
    	if(str)
    	{
    		size= strlen(str);
    		machaine = new char[size+1];
    		machaine = strcpy(machaine,str);
    	}
    	else
    	{
    		chaine une_chaine_qui_ne_sert_a_rien;//(2)
    	} 
    }
    5/ Dans ta surcharge de l'opérateur + :
    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
    chaine &chaine::operator +( const chaine & str)//const
    {
    	if (machaine)
    	{
    		char * temp = new char[size+= str.size+1];
    				
    		temp = strcpy(temp,machaine );
    		delete [] machaine;
    		machaine = strcat(temp,str.getChaine());
    		
    		return *this;
     
    	}
    // Et ici, on ne retourne rien ?????
    }
    6/ Puisque tu as un pointeur (machaine), tu dois soit utiliser un pointeur intelligent, soit redéfinir correctement les constructeurs par copie et l'opérateur d'affectation.
    Comme je suppose que tout ceci n'a comme but que d'apprendre, peut-être peux-tu essayer les deux solutions : 1) redéfinir les constructeurs par copie et l'opérateur par défaut pour comprendre les problèmes qui se cachent derrière, puis utiliser un pointeur intelligent (car on ne va pas sans cesse ré-inventer la roue).

  9. #9
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 157
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Comme l'a souligné Trunks, ce n'est pas tout à fait ce que j'ai voulu dire.
    Si on reprend ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine &chaine::operator +( const chaine & str)
    Le const s'applique au paramètre str et pas à this. Donc, pour str, tu ne peux appeler que des fonctions const et pour this tu peux appeler des fonctions const ou non const.
    en resumé si je comprends bien ceci s'appllicque meme en dohrs des definition de classe. meme dans le main.
    une fois que j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mafonc(const & paramtre)
    à l'interieur de ma fonction je ne peux modifier le parametre et l'objet ne peux appeler que des fonctions constantes (qui par definition ne doivent pas changer l'etat de l'objet) si j'appelle une methode non constant le compilateur n'a pas la garantie que l'objet n'a pas changé, même si la methode ne change pas l'objet.comme dans mon cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getchaine() ou getsize()
    .
    Si par exemple je dois avoir la taille je suis obliger de declarer une version const.
    merci pour vos reponse je crois que j'ai compris je sais que c'etais dure mais bon
    merci pour tes commentaires. Pour le std c'est plus facile puisque je ne connais pas ce qu'il y a dans ce namespace et comme ça j'inclus le tout.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par mahboub Voir le message
    pour le std c'est plus facile puisque je ne connais pas ce qu'il y a dans ce namespace et comme ca j'inclue le tout
    C'est une mauvaise habitude
    Lorsque tu utilises quelque chose, et bien regarde dans la doc dans quel namespace il est définit.

  11. #11
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 157
    Points : 112
    Points
    112
    Par défaut
    bonjour,
    merci pour tes commentaire et exactement je veux (exercice educatif, je veux comprends la manipulation des pointeur et des chaine).
    merci encore
    je vais faire tes commentaire et revise mon code

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Penses à
    Tu rouvriras une nouvelle discussion quand tu auras de nouveaux problèmes

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

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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