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 habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    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.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    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* ?

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    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<>...

+ 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