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 :

surcharge ostream - non appelé


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut surcharge ostream - non appelé
    Bonjour,
    Je suis passé par plusieurs tuto et forum discutant des pbs de surcharges d'ostream, je n'ai pas trouvé mon bonheur.

    Le problème c'est que si je met un point d'arrêt (indiqué par ->*) dans la fonction surcharge d'ostream, le programme ne s'arrête pas ! J'ai la vague impression qu'il évite la surcharge et je ne comprends pas pkoi. J'ai rajouté des std:: partout, rien ne change.

    MatriceBande.hxx
    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
     
    #ifndef MatriceBande_HeaderFile
    #define MatriceBande_HeaderFile
     
    #include <iostream>
    using namespace std;
     
    class MatriceBande
    {
     private:
     [...]
     
     public:
     [...]
      friend std::ostream & operator << ( std::ostream &, const MatriceBande &);
      void print(std::ostream&) const ;
    };
    #endif
    MatriceBande.cxx
    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
     
    #include "MatriceBande.hxx"
    [...]
    void MatriceBande::print(std::ostream & s) const
    {
       cout<<"lskcsk";
       for ( int j= 0 ; j < L ; j++) {s << A[j] <<"   ";}
       s << endl;
    }
     
    std::ostream & operator << ( std::ostream & sortie , MatriceBande & m)
    {
    ->*Point D.Arrêt
       if (m.getA()!=NULL)
       {
          m.print(sortie);
       }
       return sortie;
    }
    Test.cxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MatriceBande.hxx"
    int main ()
    {
       MatriceBande *M1 = new MatriceBande(5,3);
       std::cout<<M1;
       return 0;
    }

    La seule chose que ca affiche est :0x3d2508

    Merci pour l'aide...

  2. #2
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par FoX_*D i E* Voir le message
    Bonjour,
    Je suis passé par plusieurs tuto et forum discutant des pbs de surcharges d'ostream, je n'ai pas trouvé mon bonheur.

    Le problème c'est que si je met un point d'arrêt (indiqué par ->*) dans la fonction surcharge d'ostream, le programme ne s'arrête pas ! J'ai la vague impression qu'il évite la surcharge et je ne comprends pas pkoi. J'ai rajouté des std:: partout, rien ne change.

    ((coupé))

    Test.cxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MatriceBande.hxx"
    int main ()
    {
       MatriceBande *M1 = new MatriceBande(5,3);
       std::cout<<M1;
       return 0;
    }

    La seule chose que ca affiche est :0x3d2508

    Merci pour l'aide...
    C'est parce que ta fonction main() essaie d'afficher un pointer vers une MatriceBande, mais ta surcharge est pour une MatriceBande. Le compilateur change ton pointeur en void *, et puis il appele le surcharge de << pour des pointeurs.

    Test.cxx version 2, sans pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MatriceBande.hxx"
    int main ()
    {
       MatriceBande M1(5,3);
       std::cout<<M1;
       return 0;
    }
    Test.cxx version 3, utilisant l'étoile pour trouver une MatriceBande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MatriceBande.hxx"
    int main ()
    {
       MatriceBande *M1 = new MatriceBande(5,3);
       std::cout << *M1;
       return 0;
    }
    -- Steve

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Si tu dois forcément passer par des pointeurs, utilise des pointeur intéligents et après il suffit de déférencer ton pointeur, cad de passer de std::cout<<M1; à std::cout<<*M1;
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Merci pour les réponses rapides.

    Je me rappel avoir déjà essayé, et que ca soit par l'une ou l'autre des methodes, j'ai un problème de compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [...]/Test.cxx:5 undefined reference to 'operator<<(std::basic_ostream<char, std::char_traits<char> >&, MatriceBande const&)'
    collect2: ld returned 1 exit status

  5. #5
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::ostream & operator << ( std::ostream & sortie , MatriceBande const & m)

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    ^^ c'était vraiment tout con comme problèmes.
    La prochaine fois j'ferai un peu plus attention, merci à tous.

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

Discussions similaires

  1. Filtre non appelé avec jsp:include
    Par atuan dans le forum Taglibs
    Réponses: 1
    Dernier message: 08/11/2006, 11h27
  2. classe Action non appelée
    Par jc44 dans le forum Struts 1
    Réponses: 4
    Dernier message: 18/08/2006, 14h22
  3. onkeyup non appellé
    Par GregPeck dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/02/2006, 17h22
  4. Verifier formulaire - fonction non appelée
    Par nerick dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/12/2005, 17h44
  5. Réponses: 3
    Dernier message: 23/08/2005, 11h02

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