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 actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    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 du Club
    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
    Points : 65
    Points
    65
    Par défaut
    a tout hasard tu as essayé : m_nmane=src.m_name

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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 du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 66
    Points
    66
    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 confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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 du Club
    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
    Points : 65
    Points
    65
    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 actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    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 confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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 du Club
    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
    Points : 65
    Points
    65
    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 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 575
    Points
    41 575
    Par défaut
    Les membres protected de la classe de base ne sont accessibles que pour le même objet.

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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 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 575
    Points
    41 575
    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* ?

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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