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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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.

+ 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