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 :

operator<< : n'affiche que l'adresse de l'objet..


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut operator<< : n'affiche que l'adresse de l'objet..
    Bonjour,

    J'ai réalisé un Graphe générique, et celle ci comporte une fonction print(), déclarée comme ci-dessous :
    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
     
    template <class VertexKey, class VertexData, class EdgeKey, class EdgeData>
    class Graph
    {
         ...
        VertexData& atVertex(VertexKey key);
        EdgeData& atEdge(VertexKey vkey, EdgeKey ekey);
        ...
        void print();
    };
    ...
    template <class VertexKey, class VertexData, class EdgeKey, class EdgeData>
    void Graph<VertexKey, VertexData, EdgeKey, EdgeData>::print()
    {
        for (VertexKey i = firstVertex(); isVertexValid(); i = nextVertex())
        {
            std::cout << i << "(" << atVertex(i) << ") : ";
            for (EdgeKey j = firstEdge(); isEdgeValid(); j = nextEdge())
                std::cout << j << "(" << atEdge(i, j) << ") ";
            std::cout << std::endl;
        }
    }
    Jusque là, tout va bien (un peu comme l'histoire de l'homme qui saute du 20ème étage..). Seulement, si la donnée contenue dans le Vertex est une autre classe comme par exemple Lieu :
    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 Lieu
    {
        int ordre;
        std::string action;
     
    public:
     
        Lieu(int ordre) : ordre(ordre) { };
     
        int getOrdre() const { return ordre; };
        void setOrdre(int _ordre) { ordre = _ordre; };
     
        std::string getAction() const { return action; };
        void setAction(std::string _action) { action = _action; };
     
        friend std::ostream& operator<<(std::ostream& o, const Lieu& lieu)
        {
            return o << lieu.getOrdre() << ", " << lieu.getAction();
        };
    };
     
    -----------------
     
    Graph<int, Lieu *, int, int> activites;
    Bien que je redéfinisse l'opérateur <<, la fonction print() m'affiche toujours l'adresse de l'objet Lieu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1(0x805c6b0) : 2(2) 11(11)
    2(0x805c6e8) : 3(3)
    3(0x805c778) : 4(4)
    ...
    Or, je voudrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1(1, M) : 2(2) 11(11)
    2(2, D) : 3(3)
    3(3, O) : 4(4)
    ...
    Ca devrait être réalisable ? Est-ce la redéfinition de l'opérateur << qui n'est pas correct ?
    Merci d'avance !

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ca doit venir de la nature de la classe ostream car le code a l'air correct.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Dans ce cas préci, atVertex(i) me renvoi une référence sur Lieu *.
    Je me demandais si Lieu * était bien "concerné" par la redéfinition de l'opérateur <<.

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Et comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     o << lieu.getOrdre() << ", " << lieu.getAction();
    return o;
    ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    C'est équivalent. J'ai tout de même testé, mais ça ne résout pas le problème. J'ai l'impression qu'il manque juste un petit quelque chose..

  6. #6
    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
    Tu appelles comment ton operateur << ? C'est cette ligne là qui est peut-être à revérifier...

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Soit le remplacement suivant dans la fonction print() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <class VertexKey, class VertexData, class EdgeKey, class EdgeData>
    void Graph<VertexKey, VertexData, EdgeKey, EdgeData>::print()
    {
        for (VertexKey i = firstVertex(); isVertexValid(); i = nextVertex())
        {
            //std::cout << i << "(" << atVertex(i) << ") : ";
            std::cout << i << "(" << Lieu(1) << ") : ";
            for (EdgeKey j = firstEdge(); isEdgeValid(); j = nextEdge())
                std::cout << j << "(" << atEdge(i, j) << ") ";
            std::cout << std::endl;
        }
    }
    Cela me donne ce que j'attends, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1(1, ) : 2(2) 11(11)
    2(1, ) : 3(3)
    3(1, ) : 4(4)
    ...
    Mais atVertex() me renvoi (toujours dans ce cas) Lieu * et non pas Lieu.
    Si je fais maintenant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     template <class VertexKey, class VertexData, class EdgeKey, class EdgeData>
     void Graph<VertexKey, VertexData, EdgeKey, EdgeData>::print()
     {
         for (VertexKey i = firstVertex(); isVertexValid(); i = nextVertex())
         {
             //std::cout << i << "(" << atVertex(i) << ") : ";
             std::cout << i << "(" << new Lieu(1) << ") : ";
             for (EdgeKey j = firstEdge(); isEdgeValid(); j = nextEdge())
                 std::cout << j << "(" << atEdge(i, j) << ") ";
             std::cout << std::endl;
         }
     }
    J'obtiendrais à nouveau ce que je ne veux pas, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1(0x805cc28) : 2(2) 11(11)
    2(0x805cc38) : 3(3)
    3(0x805cc48) : 4(4)
    ...
    Je penses qu'il faut changer la déclaration de lieu (const Lieu& lieu) dans la redéfinition de l'opérateur <<. Mais je suis embrouillé et n'arrive pas à trouver celle qui est correcte.

  8. #8
    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 : 39
    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, au pire tu peux toujours faire un opérateur << qui affiche un Lieu*.

    Mais si ton graphe ne stocke que des pointeurs (par exemple) alors tu peux les déréférencer direct.

    A noter aussi qu'il existe plein de bonnes classes de graphes génériques, notamment dans boost.

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    J'ai été embrouillé par le &.. Je pensais qu'il était obligatoire, et qu'il fallait que je fasse const Lieu*& lieu (qui compile mais qui donne le même résultat).. Mais finalement, const Lieu* lieu marche parfaitement. Merci pour m'avoir ouvert les yeux
    Sinon, comme c'est un projet, je n'ai droit qu'à la STL. Ils adorent qu'on réinvente la roue..

  10. #10
    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 : 39
    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
    Si tu veux te rafraîchir les idées sur tout ça :
    http://c.developpez.com/faq/cpp/?pag...sage_parametre

  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
    Euh... tu n'oublies pas d'effacer ton objet, par hasard ? C'est bien mieux de passer un Lieu plutôt qu'un *Lieu, non ?
    Dommage que tu n'aies pas droit à Boost, il y a une belle bibliothèque de graphes.

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

Discussions similaires

  1. Image s'affiche que lors du redimensionnement
    Par gmonta dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 17/05/2005, 13h28
  2. algorithme de tri tableau :afficher que les éléments unique
    Par sofiane61 dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 31/03/2005, 19h50
  3. [Eclipse 3.0.1] Image qui n'affiche que son path
    Par thehpman dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 16/03/2005, 11h28
  4. n'afficher que les "print" dans query annalyser
    Par sky_perrinos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/12/2004, 10h58
  5. [XML] n'afficher que les 3 premiers!
    Par Little Sloth dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 01/06/2004, 10h59

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