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 :

Probleme avec la surcharge de l'operateur <<


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Par défaut Probleme avec la surcharge de l'operateur <<
    Bonjour, j'etais en train de rafraichir mon c++ , j'ai donc tente de coder une liste simplement chainee.
    voici le code , et apres les questions.
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #include <iostream>
    using namespace std;
     
    class ll{
    private:
    	typedef struct elem{ //ne pas oublier le elem ici aussi
    		struct elem* next;
    		int val;
    	}elem;
    	elem* head;
    	int nbElem;
    public:
    	ll():head(NULL),nbElem(0){};
    	~ll()
    	{
    		elem* newLink;
    		newLink=head;
    		while (head!=NULL)
    		{
    			head=head->next;
    			delete newLink;
    			newLink=head;
    		}
    	}
    	int addLink(int _val)
    	{
    		elem* newLink= new elem;
    		if (newLink==NULL) 
    		return -1;
    		newLink->val=_val;
    		newLink->next=head;
    		head=newLink;
    		++nbElem;
    		return 0;
    	}
    	friend ostream& operator<<(ostream& out, const ll& liste);
    	void print()
    	{
    		elem *cur;		
    		cur=head;		
    		while (cur!=NULL)
    		{
    			cout<<cur->val<<" ";
    			cur=cur->next;
    		}
    		cout<<head<<" ";
    		cout<<endl;
    	}
     
    };
     
    ostream& operator<<(ostream& out, const ll& liste)
    {
    	struct ll::elem *cur;
    	//	cur=const_cast<ll::elem*>(liste.head); 
    	cur=liste.head;
    	cout<<cur<<" "<<liste.head<<endl;
    	cout<<liste.nbElem<<" ";
    	while (cur!=NULL)
    	{
    		out<<cur->val<<" ";
    		cur=cur->next;
    	}
    	return out;
    }
     
    int main(int argc, char** argv)
    {
    	ll* liste=new ll;
    	liste->addLink(1);
    	liste->addLink(2);
    	liste->addLink(3);
    	liste->print();
    	cout<<liste<<endl;
    }
    La methode print marche correctement , mais la surcharge de << donne des resultats suspects... j'ai affiche la valeur de head dans les 2 fonctions et ils semblent que les valeurs soient differentes.

    D:\VS2008\VC>source
    3 2 1 00551BC0
    00551B90
    Est ce que vous savez d'ou vient le soucis ?

    Merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par zebullax Voir le message
    Bonjour, j'etais en train de rafraichir mon c++ , j'ai donc tente de coder une liste simplement chainee.
    voici le code , et apres les questions.
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #include <iostream>
    using namespace std;
     
    class ll{
    private:
    	typedef struct elem{ //ne pas oublier le elem ici aussi
    		struct elem* next;
    		int val;
    	}elem;
    	elem* head;
    	int nbElem;
    public:
    	ll():head(NULL),nbElem(0){};
    	~ll()
    	{
    		elem* newLink;
    		newLink=head;
    		while (head!=NULL)
    		{
    			head=head->next;
    			delete newLink;
    			newLink=head;
    		}
    	}
    	int addLink(int _val)
    	{
    		elem* newLink= new elem;
    		if (newLink==NULL) 
    		return -1;
    		newLink->val=_val;
    		newLink->next=head;
    		head=newLink;
    		++nbElem;
    		return 0;
    	}
    	friend ostream& operator<<(ostream& out, const ll& liste);
    	void print()
    	{
    		elem *cur;		
    		cur=head;		
    		while (cur!=NULL)
    		{
    			cout<<cur->val<<" ";
    			cur=cur->next;
    		}
    		cout<<head<<" ";
    		cout<<endl;
    	}
     
    };
     
    ostream& operator<<(ostream& out, const ll& liste)
    {
    	struct ll::elem *cur;
    	//	cur=const_cast<ll::elem*>(liste.head); 
    	cur=liste.head;
    	cout<<cur<<" "<<liste.head<<endl;
    	cout<<liste.nbElem<<" ";
    	while (cur!=NULL)
    	{
    		out<<cur->val<<" ";
    		cur=cur->next;
    	}
    	return out;
    }
     
    int main(int argc, char** argv)
    {
    	ll* liste=new ll;
    	liste->addLink(1);
    	liste->addLink(2);
    	liste->addLink(3);
    	liste->print();
    	cout<<liste<<endl;
    }
    La methode print marche correctement , mais la surcharge de << donne des resultats suspects... j'ai affiche la valeur de head dans les 2 fonctions et ils semblent que les valeurs soient differentes.



    Est ce que vous savez d'ou vient le soucis ?

    Merci.
    Oui : ta surcharge attends un objet de type liste, tu lui donne un pointeur sur un objet de type liste. operator<<(ostream&, T*) existe déjà, et affiche la valeur du pointeur quelque soit T. Dans ton cas, le code affiche l'adresse de ton objet liste.

    Tu te sers de cette fonctionnalité pour afficher la valeur de head, donc tu devrais savoir

    Pour corriger le code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << *liste << std::endl;
    Ou mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(int argc, const char* argv[])
    {
    	ll liste;
    	liste.addLink(1);
    	liste.addLink(2);
    	liste.addLink(3);
    	liste.print();
    	cout << liste << endl;
    }
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Par défaut
    Huuuuu etourderie totale.
    Merci.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Puisque tu dis réviser le C++, je me permets quelques remarques :
    -> using namespace std : j'ai tendance à les éviter dans les .cpp et les prohiber dans les .h (Quand utiliser / ne pas utiliser using namespace ?)

    -> En C++, contrairement au C, pas besoin du typedef pour les déclarations de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class ll{
    private:
    	struct elem{
    		elem* next;
    		int val;
    	};
    -> Ta classe gère une ressource (allocation dynamique) mais ne définit pas de politique de copie. F.A.Q. : Comment gérer proprement des allocations / désallocations de ressources ? Le RAII ! et Présentation des pointeurs intelligents.

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

Discussions similaires

  1. probleme avec fonction surchargée
    Par le_voisin dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/01/2009, 01h59
  2. Probleme avec constructeur surchargé
    Par dr971 dans le forum C++
    Réponses: 3
    Dernier message: 04/04/2007, 11h16
  3. probleme avec les operateurs de comparaison
    Par vanilla94 dans le forum Langage
    Réponses: 11
    Dernier message: 13/11/2006, 11h18
  4. [debutant]probleme avec l'operateur +
    Par Battosaiii dans le forum Débuter
    Réponses: 9
    Dernier message: 17/11/2005, 01h29
  5. probleme avec le mot const et operateur==
    Par elekis dans le forum C++
    Réponses: 4
    Dernier message: 06/05/2005, 13h21

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