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 :

[POO] Constructeur par copie


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut [POO] Constructeur par copie
    Bonjour,

    Je voudrais realiser un constructeur par copie, jusque la rien de difficile, mais j'y arrive pas . (Et j'ai pas trouver d'exemple complet dans la FAQ).

    Voici: (je met que l'essentiel)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class MaClasse
    {
    public:
    MaClasse();
    MaClasse(const MaClasse &src);
    ~MaClasse();
     
    inline CString getName(void)  {return m_name;}
     
    protected:
    CString m_name;
    };
    Et dans mon .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MaClasse::MaClasse(const MaClasse &src)
    {
      m_name = src.getName();
    }
    Et ca compile pas la.
    Il me retourne comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2662: 'getPar' : cannot convert 'this' pointer from 'const class MaClasse' to 'class MaClasse&'
    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Par défaut
    a tout hasard tu as essayé : m_nmane=src.m_name

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut

    Apparament ca marche! (ca compile en tout cas)

    Mais ma variable est protected, comment ca se fait que ca marche? Normalement je devrais pas y avoir acces, non?

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline CString getName(void) const  {return m_name;}

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Le paramètre étant pris par référence constante, tu ne peux appeler que des fonctions membres constantes sur lui.

    Ensuite à l'intérieur de la classe tu as accès aux données privées et protégées, même d'autres instances.

    Il vaut mieux utiliser la liste d'initialisation dans les constructeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaClasse::MaClasse(const MaClasse &src) :
    m_name(src.m_name)
    {
     
    }
    Et enfin, il est inutile d'écrire un constructeur par copie si les données membres ne sont pas copiables trivialement (ici il est donc inutile).

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut
    tu ne peux appeler que des méthodes 'const' sur un objet 'const', donc il faut remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inline CString getName(void)  {return m_name;}
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inline CString getName(void) const {return m_name;}
    pour que la première version compile.
    sinon, c'est normal que tu puisses acceder a un attribut protected d'une instance depuis une autre. c'est juste qu'il n'est pas visible de l'extérieur.

  7. #7
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Tu est dans une fonction membre de ta classe c'est donc autorisé.
    Tu ne l'appelle pas depuis l'exterieur.

    Oup ! trop tard.
    Tir groupé.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par kacedda
    Mais ma variable est protected, comment ca se fait que ca marche? Normalement je devrais pas y avoir acces, non?
    Tu es dans le code de la classe, tu as acces a tous les membres de la classe (sauf les protected de classes de base), quelque soit leur objet (this ou un autre).

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Par défaut
    quelle soit private ou protected normalement tu y as accés car tu y fais appel dans la meme classe par exemple si tru avais un heritage

    class derivee : public classe deBase

    ta classe derivee ne peut accéder qu'aux membres public de ta classe de
    Base mais la fonction de base a accés a ses membres protégés et privées sinon personnes ne pourrait les initialiser et les utiliser les fonctions qui retourne ou change de valeur des membres privés ou protégés sont utilisés par les dérivées

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Wow! merci pour toutes les reponses.
    Si j'ai pas compris apres ca .

    Ok c'est cool j'ai compris le principe du const et de l'accession.
    Je vais modifier en sorte.

    Laurent Gomila: oui pour les objets triviaux, mais en fait dans ma classe j'avais le meme probleme sur des structures plus complexes, et j'avais pris un exemple plus simple pour illustrer.

    A+ tous et encore merci

  11. #11
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    quelle soit private ou protected normalement tu y as accés car tu y fais appel dans la meme classe par exemple si tru avais un heritage
    class derivee : public classe deBase
    ta classe derivee ne peut accéder qu'aux membres public de ta classe
    Dite moi si je me trompe, mais en derivation public elle peut bien accéder aux membre protected aussi ?

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dite moi si je me trompe, mais en derivation public elle peut bien accéder aux membre protected aussi ?
    http://c.developpez.com/faq/cpp/?pag...private_public

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Par défaut
    excuse tu as raison les classes dérivées ont accés aux membres protected de la classe de base

  14. #14
    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
    Les membres protected de la classe de base ne sont accessibles que pour le même objet.
    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.

  15. #15
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Les membres protected de la classe de base ne sont accessibles que pour le même objet.
    Pour d'autres objects également, mais de la même classe.

  16. #16
    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 veux dire que, bien que ça ne marche pas avec un autre objet via un pointeur base*, ça marche avec un autre objet via un pointeur de type derivee* ?
    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.

  17. #17
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Tu veux dire que, bien que ça ne marche pas avec un autre objet via un pointeur base*, ça marche avec un autre objet via un pointeur de type derivee* ?
    Oui. Dans ce qui suit, cp1 est valide, cp2 et cp3 pas.

    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
    class A {
    protected:
      int x;
    };
     
    struct C: public A {};
     
    struct B: public A {
      void cp1(B const & b) {
        x = b.x;
      }
      void cp2(A const & a) {
        x = a.x;
      }
      void cp3(C const & c) {
        x = c.x;
      }
    };

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

Discussions similaires

  1. Constructeur par copie et operateurs
    Par NiamorH dans le forum C++
    Réponses: 11
    Dernier message: 07/07/2007, 17h37
  2. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  3. Réponses: 5
    Dernier message: 03/12/2006, 15h55
  4. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 19h15
  5. [deb.]Constructeur par copie
    Par Marc_3 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2005, 13h33

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