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 :

Copie, affectation, et pointeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut Copie, affectation, et pointeurs
    Bonjour,

    Je suis assez bien bloquée depuis hier sur un problème. J'ai un niveau assez basique en C++...
    J'ai écrit une classe qui est en gros une liste chaînée à l'aide de pointeurs : elle a un champ valeur, et un pointeur vers une autre liste, qui a elle-même une valeur etc.

    Bon, jusque là, ok.

    Le problème (entre autres) que je rencontre, c'est avec les constructeurs de copie et d'assignation. J'ai pensé y faire appel de façon récursive,
    Je reçois cette erreur à l'exécution (plus d'erreur lors de la compil) :

    00
    isEmpty : 1
    isEmpty : 0
    Erreur de segmentation (core dumped)
    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
    26
    27
    28
    29
    30
    31
    32
    33
     
    maListe::maListe(const maListe& ml) 
    {
    	push(ml.getData());
     
    	if (not ml.isEmpty())
    	{
    		maListe temp = ml;
    		while (not temp.isEmpty())
    		{
    			push(temp.getData());
    			temp = temp.getNextListe(); // retourne l'objet pointé par le pointeur, une liste, donc
    		}
    	}
    }
     
    maListe& maListe::operator=(const maListe &ml )
    {
     	if ( this != &ml )
     	{
     		push(ml.getInfo())
     		if (not ml.isEmpty())
     		{
    	   		maListe temp = ml;
    	   		while (not temp.isEmpty())
    	   		{
    	   			push(temp.getData());
    	   			temp = temp.getNextListe();
    	   		}		
     		}
    	}
       	return *this;
     }
    J'ai un main, qui fait basiquement cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	maListe ml1;
    	cout << ml1.getNext() << ml1.getData() << endl;
    	maListe ml2;
    	cout << "isEmpty : " << ml1.isEmpty() << endl;
    	ml1.push(3);
    	cout << "isEmpty : " << ml1.isEmpty() << endl;
    	maListe ml3 = ml1;
    	cout << ml3.isEmpty() << endl;
    Quelqu'un pourrait me guider un peu, voire me guider vers des liens ? J'ai lu beaucoup de choses mais je m'y perds et finalement, je ne sais plus du tout comment procéder.
    :s

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Les seules references que j'ai trouve par-rapport au mot-cle not sont soit en C, soit en asm. Je pense qu'il vaut mieux eviter de s'en servir...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << ml1.getNext() << ml1.getData() << endl;
    Pour moi cette ligne n'a aucun sens. As-tu une surcharge de l'operateur "<<" quelque part ? Quelque chose dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::iostream operator<<(std::iostream &c, const maListe &l);
    PS: par convention on a plutot l'habitude de faire commencer les noms de classe par une majuscule en C++.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    J'ai commencé une surcharge de <<, mais je préférais ne pas l'utiliser pour le moment, parce que justement, comme j'ai quelques soucis pour parcourir ma liste...
    Cela dit depuis quelques heures, j'ai quand même progressé, je peux réessayer.

    Je ne savais pas pour not Merci !

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je n'ai pas tout compris, il manque des étapes dans le code que tu as posté pour tout suivre, mais ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maListe::maListe(const maListe& ml) 
    {
    	push(ml.getData());
     
    	if (not ml.isEmpty())
    	{
    		maListe temp = ml;
    Tu définis un constructeur de copie de maListe, prenant en paramètre une autre liste, nommée ml. Jusque là, tout va bien.
    Mais à la dernière ligne, tu déclares une variable nommée temp que tu initialise à l'aide de ml, c'est à dire que tu appelles le constructeur de copie de maListe que tu es justement en train de définir.
    Le constructeur de copie s'appelle donc récursivement, et à moins que getData ne fasse des choses étranges, je ne vois rien qui empêche cette récursion d'être infinie, d'où l'explosion de la pile à un moment.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    En effet. C'est d'ailleurs le problème, puisque je ne sais pas trop comment faire, du coup :s

  6. #6
    Membre confirmé Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Par défaut
    Pour effectuer une copie d'une liste chaînée tu doit en premier lieu redéfinir l'opérateur "=" pour les maillons de ta liste.
    Puis le constructeur par copie va parcourir tous les maillons fils de la chaîne et les copier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maListe::maListe(const maListe& ml) 
    {
        if (ml==NULL)
            return;
        *this = ml;
        maListe(ml.child);
    }
    Imaginons une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *-----*------*------*------*------NULL
    L'opérateur = va effectuer l'opération suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    *-----*------*------*------*------NULL
                    \       /
                     \--*--/
    Le constructeur par copie va effectuer l'opération suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    *-----*------*------*------*------NULL
                    \       
                     \--*------*------NULL/

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par imperio Voir le message
    Les seules references que j'ai trouve par-rapport au mot-cle not sont soit en C, soit en asm. Je pense qu'il vaut mieux eviter de s'en servir..
    Il fait partie de la liste des mots-clé du C++, tout comme or, not_eq, etc.

  8. #8
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Citation Envoyé par oodini Voir le message
    Il fait partie de la liste des mots-clé du C++, tout comme or, not_eq, etc.
    Je me coucherai moins bete ce soir. Merci pour l'info !

  9. #9
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par oodini Voir le message
    Il fait partie de la liste des mots-clé du C++, tout comme or, not_eq, etc.
    Visual Studio ne le reconnait pas par défaut. Il faut soit désactiver les "extensions" soit inclure iso646.h (ciso646), comme en C. Mais c'est ici un non respect de la norme par VS. Je sais pas comment se comporte gcc ni clang la dessus.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par oodini Voir le message
    Il fait partie de la liste des mots-clé du C++, tout comme or, not_eq, etc.
    Par contre, certains compilos (Visual C++, je ne sais pas si ça a changé...) ne connaissent pas...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Par défaut
    En théorie, oui, je sais qu'on devrait faire appel à un Node. Seulement pour mon travail, je ne peux pas en utiliser, ce qui me complique beaucoup la tâche.

Discussions similaires

  1. copie / affectation
    Par ikuzar dans le forum Débuter
    Réponses: 5
    Dernier message: 12/04/2011, 15h05
  2. operateur new et affectation de pointeur
    Par Nehmé dans le forum C++
    Réponses: 4
    Dernier message: 06/11/2009, 04h09
  3. Réponses: 4
    Dernier message: 04/02/2009, 16h08
  4. affectations différentes ? pointeurs ?
    Par Isendar dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 13/05/2008, 21h04
  5. Affecter un pointeur de fichier a un autre
    Par dr_octopus74 dans le forum Bibliothèque standard
    Réponses: 8
    Dernier message: 16/03/2008, 09h33

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