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 :

Constructeur par recopie


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Points : 46
    Points
    46
    Par défaut Constructeur par recopie
    Bonjour,
    Je suis étudiant et je travaille actuelement sur un programme rédigé en C++.
    Dans ce programme, il y a des classes :
    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
     
    class CObjetMaillage
    {
    public:
     CObjetMaillage();
     virtual ~CObjetMaillage();
     etc...
    protected:
     double MaxX,MaxY,MaxZ;
     double MinX,MinY,MinZ; 
     std::vector<CStructureSommet*> ListeSommet;
     std::vector<CStructureFace*> ListeFace;
     std::vector<int> ListeNbSommetPair;
     std::vector<int> ListeNbFaceAncienne;
    };
     
    class CStructureSommet  
    {
    ...
    };
     
    class CStructureFace
    {
    ...
    };

    J'ai un probléme, je manipule que des pointeurs d'objet (CObjetMaillage* clMaillage, CStructureSommet* Sommet_Maillage, CStructureFace* Face_Maillage) et je souhaiterais faire une copie d'un objet de type CObjetMaillage.
    Mais je ne sais pas comment faire!!!!
    En faisant de cette méthode évidemment ca ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CObjetMaillage *Obj1, *Obj2;
    Obj1=Obj2;
    car lorsque je modifie un objet l'autre aussi puisque c'est le meme pointeur.

    Je voudrais savoir comment je peux faire une copie propre???

    J'ai deja essayé de créer un contructeur par recopie mais ca ne marche pas non plus car il faut passer un objet de type CObjetMaillage par référence.

    Aidez moi svp.

  2. #2
    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
    Rien ne t'empêche de copier des objets, même si tu les manipules via des pointeurs. Faut juste penser à copier les objets pointés et non les pointeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CObjetMaillage *Obj1, *Obj2;
    *Obj1 = *Obj2;
    Le constructeur par copie et l'opérateur d'affectation générés par le compilo devraient être suffisants, pas besoin de les ré-écrire.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pourquoi la méthode que tu proposes ne marche pas ? Parce que tu as oublié un * dans ce que tu proposes ou à cause d'autre chose ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Alors si je fais :
    Lorsque je vais modifier Obj1 ca n'affectera pas Obj2???

    Merci d'avance.

  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
    Oui, tu vas affecter la valeur de Obj2 à Obj1 mais tu auras toujours deux objets physiquement différents.

    Par contre pas besoin de * si tu utilises l'opérateur ->.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Obj1->SetNombreDeSommet(5);
     
    // Ou bien
     
    (*Obj1).SetNombreDeSommet(5);

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Ok.
    Merci beaucoup Laurent Gomila.

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Bebert71
    Alors si je fais :
    Lorsque je vais modifier Obj1 ca n'affectera pas Obj2???

    Merci d'avance.
    Mais n'oublie pas d'allouer l'espace mémoire nécessaire pour créer Obj2 !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Je ne comprends pas ce que tu dis.
    Mon objet Obj2 est deja créé alors pourquoi je devrais allouer l'espace mémoire pour le créer????

    Je veux seulement affecter les valeurs de l'objet Obj2 à celles de l'objet Obj1.
    Sachant que Obj1 est déclaré comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     CObjetMaillage* Obj1 =new CObjetMaillage();

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Et Obj2 ? Car ce Obj1 et Obj2 ne sont que des pointeurs, pas les objets que tu utilises réellements. Obj1 pointe vers un objet existant, mais Obj2 ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    J'arrive pas a saisir ce que tu veux dire.
    Ce programme ce n'est pas moi qui l'ai rédigé donc je le maitrise pas du tout.
    En fait mes 2 objets s'appellent Maillage et clForme. Je veux recopier les informations de Maillage dans clForme.
    La seule déclaration de Maillage dans le programme est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CObjetMaillage * Maillage=new CObjetMaillage();
    Cet objet comporte des informations sur des structures géométriques : cad NbSommets, NbFaces, ListeFaces, ListeSommets, ...
    Je veux recopier toutes ces informations dans un nouvel objet que je veux appeler clForme.

    Comment je dois faire??

    Moi j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CObjetMaillage* clForme =new CObjetMaillage();
     *clForme=*Maillage;
    Mais ca ne marche pas.

    J'ai aussi essayé ca en vaint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     //Copies des sommets
     for (long i=0; i<Maillage->GetNombreDeSommet(); i++)
     {
      CStructureSommet* Sommet_Maillage = Maillage->GetSommetListe(i);
      clForme->AddSommetListe(Sommet_Maillage);
     }
     //Copies des faces
     for (long j=0; j<Maillage->GetNombreDeFace(); j++)
     {
      CStructureFace* Face_Maillage = Maillage->GetFaceListe(j);
      clForme->AddFaceListe(Face_Maillage);
     }

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    OK, c'est normalement ça.
    Tu ne définis aucun constructeur de recopie, donc c'est l'implicite qui va être utilisé, et il va utiliser de même les constructeurs par récopie de tes variables internes.
    Donc par exemple, le contenu des vecteurs sera recopié, mais les pointeurs pointeront toujours encore sur les mêmes objets. Pour changer ça, il faut faire son propre constructeur par copie.

    Qu'est ce qui ne marche pas réellement, comment ça devrait fonctionner et comment ça fonctionne en réalité ? - tu as essayé de voir au débuggeur ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Oui je sais qu'il n'y a pas de constructeur par recopie, c'est pour cela que j'en ai créé un : le probleme est qu'il faut passer en parametre une reference constante d'un objet et non une adresse.

    Mais bon de toute facon j'ai contourné mon problème. Je n'ai plus besoin de recopier mon objet.

    Merci a tous de m'avoir aider.

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    OK, tant mieux si tu as trouvé une parade
    N'oublie pas le

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Points : 46
    Points
    46
    Par défaut
    Je veux bien mettre résolu mais je n'ai pas vraiment résolu le problème, je l'ai juste contourné lol.

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

Discussions similaires

  1. ofstream dans le constructeur par recopie
    Par mopio dans le forum C++
    Réponses: 2
    Dernier message: 02/10/2007, 12h00
  2. Réponses: 11
    Dernier message: 25/08/2006, 17h00
  3. [Débutant] Constructeur par recopie pour TComponent
    Par Runlevel dans le forum C++Builder
    Réponses: 9
    Dernier message: 06/05/2006, 17h58
  4. Constructeur par recopie
    Par KernelControl dans le forum C++
    Réponses: 2
    Dernier message: 29/12/2005, 13h24
  5. Constructeur par recopie
    Par sdebrois dans le forum Composants VCL
    Réponses: 13
    Dernier message: 21/10/2004, 15h47

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