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 de copie


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut constructeur de copie
    j'ai la classe graphe.h suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Graphe
    {
    private :
    	vector<Noeud*> vecNoeuds;
    	int numNoeud ;
    	Lien** matLiens;
    public :
    	Graphe();
    	Graphe(const Graphe&);
            ~Graphe();
            int getNbNoeuds();
    };
    J'arrive à coder le constructeur par défaut ainsi que le destructeur mais j'ai trouvé des problèmes avec le constructeur de copie. Svp aidez moi.

    code constructeur par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Graphe::Graphe()
    {
    	numNoeud = 0;
    	matLiens = new Lien* [getNbNoeuds()]; 
    	for(int i=0; i<getNbNoeuds(); i++)
        {
           	   matLiens[i] = new Lien[getNbNoeuds()]; 
        }
    }
    code destructeur :

    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
     
    Graphe::~Graphe()
    {
     
      for(int i=0 ; i < getNbNoeuds() ; i++)
     
    	delete vecNoeuds[i];
            vecNoeuds.clear();
     
     
       for(int i = 0;i < getNbNoeuds() ;i++) 
    	 {delete [] matLiens[i];}
     
        delete [] matLiens;   
     
    }
    Remarque :

    Dans les deux codes précédant getNbNoeuds() c'est une méthode qui retourne les nombres des noeuds. Autrement, c'est la taille du vecteur vecNoeuds. Est il possible de l'utiliser dans les constructeurs et le destructeurs pour construire la matrice qui a pour taille (nbNoeuds*nbNoeuds)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    int Graphe::getNbNoeuds()
    {
    	return this->vecNoeuds.size();
    }

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,



    mais j'ai trouvé des problèmes avec le constructeur de copie
    Quels genres de problèmes rencontre-tu?
    Une double libération de la mémoire ?

  3. #3
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut
    Tout d'abord, l’implémentation du constructeur par défaut et du destructeur est elle correcte? surtout l'utilisation de la fonction getNbNoeuds()?

    pour le constructeur de copie j'essaye de le coder comme suit :
    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
     
    Graphe::Graphe(const Graphe& g)
    {
    	this->numNoeud=g.numNoeud;
    	for(unsigned int i=0; i<vecNoeuds.size();i++)
    	{
         vecNoeuds[i] = new Noeud();
    	 vecNoeuds[i] = g.vecNoeuds[i];
        }
     
    	for(unsigned int i=0; i<getNbNoeuds();i++)
    	{
    		for(unsigned int j=0; j<getNbNoeuds();j++)
    	     this->matLiens[i][j] = g.matLiens[i][j];
    	}
    }

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Les constructeur par copie est un constructeur comme un autre, il faut donc que tu alloues le tableau pointé par Lien** matLiens, que tu resize() vector<Noeud*> vecNoeuds.

    Tu peux aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C::C( const C & other)
              : m_var1(other.m_var1),
                m_var2(other.m_var2)
    {
     
    }

  5. #5
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut
    Merci.

    Donc, je dois corriger et ajouter matLiens = new Lien*[getNbNoeuds()];


    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
    Graphe::Graphe(const Graphe& g)
    {
    	this->numNoeud=g.numNoeud;
    	for(int i=0; i<getNbNoeuds();i++)
    	{
         vecNoeuds[i] = new Noeud();
    	 vecNoeuds[i] = g.vecNoeuds[i];
        }
    
    	for(int i=0; i<getNbNoeuds();i++)
    	{
    		matLiens = new Lien*[getNbNoeuds()];
    		for(int j=0; j<getNbNoeuds();j++)
    			 
    	         this->matLiens[i][j] = g.matLiens[i][j];
    	}
    }

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Inspires-toi de ton constructeur par défaut.
    Là tu n'alloues que la première dimension de ton tableau, il faut aussi allouer la seconde dimension.

  7. #7
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut
    Encore Merci.

    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
    Graphe::Graphe(const Graphe& g)
    {
    	this->numNoeud=g.numNoeud;
    	for(int i=0; i<getNbNoeuds();i++)
    	{
         vecNoeuds[i] = new Noeud();
    	 vecNoeuds[i] = g.vecNoeuds[i];
        }
    
    	matLiens = new Lien*[getNbNoeuds()];
    	for(int i=0; i<getNbNoeuds(); i++)
        {       
    	   matLiens[i] = new Lien[getNbNoeuds()]; 
        }
    
    	for(int i=0; i<getNbNoeuds();i++)
    	{		
    		for(int j=0; j<getNbNoeuds();j++)
    			 
    	     this->matLiens[i][j] = g.matLiens[i][j];
    	}
    }

  8. #8
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut
    l'appel de ce constructeur n'affiche rien. j'ai fait le test que sur le vecteur vecNoeuds comme suit :

    main.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Graphe g,g1;
    g.ajouter(noeud1);
    g.ajouter(noeud2);
    g.afficher(); // afficher les caractéristiques des nœuds dans vecNoeuds
    g1(g);
    g1.afficher();
    A l'exécution, l'affichage de g a donné les caractéristiques des noeuds mais l'affichage de g1 ne donne rien.

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par kochfet Voir le message
    l'appel de ce constructeur n'affiche rien. j'ai fait le test que sur le vecteur vecNoeuds comme suit :

    main.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Graphe g,g1;
    g.ajouter(noeud1);
    g.ajouter(noeud2);
    g.afficher(); // afficher les caractéristiques des nœuds dans vecNoeuds
    g1(g);
    g1.afficher();
    A l'exécution, l'affichage de g a donné les caractéristiques des noeuds mais l'affichage de g1 ne donne rien.
    Et ça compile ??
    Là tu utilise l'opérateur : operator()(const Graphe & other); et non le constructeur par copie.

  10. #10
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut
    oui ca compile.

    et concernant l'affichage de g1 il faut écrire g1=g (appel au constructeur de copie)

  11. #11
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par kochfet Voir le message
    oui ca compile.

    et concernant l'affichage de g1 il faut écrire g1=g (appel au constructeur de copie)
    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Graphe g, g1;
     
    g1 = g;
    Ce sera l'opérateur d'affectation qui sera appelé et non le constructeur par copie.

  12. #12
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut
    malgré tous les essais j'arrive pas à définir mon constructeur de copie ni l'appeler.
    j'ai besoin de votre aide.

  13. #13
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Un constructeur de copie s'utilise à la déclaration :

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Nasky Voir le message
    Un constructeur de copie s'utilise à la déclaration :
    Il s'utilise à l'initialisation/définition.

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

Discussions similaires

  1. [résolu]les constructeurs de copie
    Par pouss dans le forum Langage
    Réponses: 9
    Dernier message: 28/06/2005, 10h57
  2. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  3. [C++]Heritage et constructeur de copie
    Par matazz dans le forum C++
    Réponses: 2
    Dernier message: 25/03/2005, 12h31
  4. Constructeur de copie modifiant le paramètre ?
    Par Nicodemus dans le forum C++
    Réponses: 4
    Dernier message: 12/01/2005, 21h25
  5. Constructeur de copie et Template: Transtypage
    Par ikkyu_os dans le forum Langage
    Réponses: 9
    Dernier message: 26/12/2004, 22h29

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