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 :

[Debutant] Problème avec un constructeur par copie


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut [Debutant] Problème avec un constructeur par copie
    Bonjour,

    J'essaye désespérément de créer un constructeur par copie :

    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
    Animation::Animation(const Animation &UneImage){
    	short int* cadre_tmp ;
    	short int* position_tmp;
    	short int* rvb_tmp ;
     
    	position_tmp = UneImage.RecupererPosition();
    	cadre_tmp = UneImage.RecupererCadre();
    	rvb_tmp = UneImage.RecupererCouleurTransparente();
     
    //s'occupe de charger l'image
     
    	ModifierAnimation(UneImage.RecupererNom(),UneImage.RecupererType(),UneImage.RecupererChemin(),position_tmp[0] ,position_tmp[1],cadre_tmp[0],cadre_tmp[1],cadre_tmp[2],cadre_tmp[3],rvb_tmp[0] ,rvb_tmp[1] ,rvb_tmp[2]);
     
    	if (UneImage.RecupererFps() != FPS) temps.ModifierFps(UneImage.RecupererFps()) ; 
    };
    Seulement une fois à la compilation, je tombe sur les erreurs de compilation suivante et je comprend pas du tout comment les résoudre :
    ../Animation_Propre/Animation.cpp: In copy constructor ‘Animation::Animation(const Animation&)’:
    ../Animation_Propre/Animation.cpp:221: erreur: passing ‘const Animation’ as ‘this’ argument of ‘short int* Animation::RecupererPosition()’ discards qualifiers
    ../Animation_Propre/Animation.cpp:222: erreur: passing ‘const Animation’ as ‘this’ argument of ‘short int* Animation::RecupererCadre()’ discards qualifiers
    ../Animation_Propre/Animation.cpp:223: erreur: passing ‘const Animation’ as ‘this’ argument of ‘short int* Animation::RecupererCouleurTransparente()’ discards qualifiers
    ../Animation_Propre/Animation.cpp:227: erreur: passing ‘const Animation’ as ‘this’ argument of ‘char* Animation::RecupererNom()’ discards qualifiers
    ../Animation_Propre/Animation.cpp:227: erreur: passing ‘const Animation’ as ‘this’ argument of ‘typeAnimation Animation::RecupererType()’ discards qualifiers
    ../Animation_Propre/Animation.cpp:227: erreur: passing ‘const Animation’ as ‘this’ argument of ‘char* Animation::RecupererChemin()’ discards qualifiers
    Si quelqu'un pouvait m'expliquer l'erreur et comment la resoudre je lui en serais grès.

    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Toutes ces méthodes doivent être déclarées en tant que méthodes const puisqu'elles ne modifient pas l'objet auquel elles s'appliquent.
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut
    Merci beaucoup de cette réponse mais le problème c'est que je suis confronté a un nouveau problème.

    Car nombre de mes accesseurs renvoient des char* ou des short int*.
    Hors pour une fonction définit comme const

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     char*  Image::RecupererNom() const {
    	if (VerificationInitialisation()) return nom_fichier ; else return NULL ;
    };
    Le compilateur me dit :
    Image.cpp: In member function ‘char* Image::RecupererNom() const’:
    Image.cpp:174: erreur: invalid conversion from ‘const char*’ to ‘char*’
    Il faut que je cast chaque objet que je return avec un const_cast ?
    Car je ne peux pas définir nom_fichier comme constant vu qu'il est modifié dans certaines fonctions.

    Y'a t'il une astuce ?

    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu peux faire deux définitions de la fonction, l'une const et l'autre non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char*  Image::RecupererNom() {
    	if (VerificationInitialisation()) return nom_fichier ; else return NULL ;
    };
    char const*  Image::RecupererNom() const {
    	if (VerificationInitialisation()) return nom_fichier ; else return NULL ;
    };
    PS: Ne devrais-tu pas plutôt utiliser des std::string que des char* ?
    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.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut
    Cette solution m'entraine des erreurs à la compilation
    Image.h:131: erreur: ‘const char* Image::RecupererNom() const’ cannot be overloaded
    Image.h:130: erreur: with ‘char* Image::RecupererNom() const’
    Image.h:131: erreur: ‘const char* Image::RecupererNom() const’ cannot be overloaded
    Image.h:130: erreur: with ‘char* Image::RecupererNom() const’
    Pour le string oui je pourrais effectivement les utiliser à la place des char* même si je suis beaucoup moins familiariser avec ce type. Mais comment remplacer les short int* ?

    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu as laissé les deux fonctions en const, seule celle qui retourne const char * doit l'être.

    Pour tes short int *, s'il s'agit de tableaux, tu peux utiliser des std::vector<>...
    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.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/06/2011, 23h36
  2. problème avec le constructeur de copie
    Par ikuzar dans le forum Débuter
    Réponses: 14
    Dernier message: 02/02/2011, 17h26
  3. Problème constructeur par copie listes chainées
    Par Nicoclem dans le forum C++
    Réponses: 4
    Dernier message: 10/04/2008, 11h44
  4. Petit problème avec le constructeur par copie
    Par beegees dans le forum C++
    Réponses: 16
    Dernier message: 01/04/2008, 16h34
  5. Réponses: 10
    Dernier message: 29/10/2007, 14h15

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