OVH Cloud OVH Cloud

operator

3 réponses
Avatar
David
Bonjour,
J'ai un problème avec le code ci dessous pour afficher correctement le
résultat de l'opérateur <<. Pourquoi le ID est
toujours une adresse au lieu de la vrai valeur de id???

Mon programme fait un appel a genericfactory qui renvoi un objet de type
Parser. Ensuite j'implemente les membres de Parser dans OBOparser que
j'utilise pour déclarer mon ostream.
OBparser est du type:
class OBOparser : public parser
{
....

};

friend ostream &operator<<(ostream &os, const OBOparser &obo);


Résutat de l'execution:


0x80583e0

0x80583e0

0x80583e0

#############
main
Mon appel dans le main.
GenericFactory *gf = new GenericFactory(ls);
Parser *obo = gf->setParser(type);
cout << *obo <<;
....

############
OBOparser.h
class OBOparser : public Parser {
...
friend ostream &operator<<(ostream &os, const OBOparser &obo);


private:
std::string id;
};


#############
OBOparser.cpp

quelque part ici id = "some text";

ostream &operator<<(ostream &output, const OBOparser &obo )
{
output << obo.id << endl;
return output;
}

3 réponses

Avatar
xavier
David a dit le 03/02/2005 17:47:
Parser *obo = gf->setParser(type);
cout << *obo <<;


Donc, appel de
ostream & operator<<(ostream &os, Parser const &);


Pour faire quelque chose de ce type, je te propose :

! class Parser {
! // ...
! void stream_output(ostream & o) = 0;
! // ...
! };
!
! class OBOParser : public Parser {
! // ...
! void stream_output(ostream & o) { o << id << endl; }
! };
!
! ostream & operator<<(ostream & o, Parser const & p) {
! p.stream_output(o);
! return o;
! }

xavier

Avatar
Falk Tannhäuser
xavier wrote:
! class Parser {
! // ...
! void stream_output(ostream & o) = 0;


Il manque 2 choses:
virtual void stream_output(ostream& o) const = 0;

! };
!
! class OBOParser : public Parser {
! // ...
! void stream_output(ostream & o) { o << id << endl; }


Ici, il faut aussi ajouter le 'const'.

! };
!
! ostream & operator<<(ostream & o, Parser const & p) {
! p.stream_output(o);
! return o;
! }


Du coup, l'opérateur
ostream& operator<<(ostream& o, OBOParser const& p)
n'est plus nécessaire.

Falk

Avatar
David
Ok merci,
ca marche....

Falk Tannhäuser wrote:

xavier wrote:
! class Parser {
! // ...
! void stream_output(ostream & o) = 0;


Il manque 2 choses:
virtual void stream_output(ostream& o) const = 0;

! };
!
! class OBOParser : public Parser {
! // ...
! void stream_output(ostream & o) { o << id << endl; }


Ici, il faut aussi ajouter le 'const'.

! };
!
! ostream & operator<<(ostream & o, Parser const & p) {
! p.stream_output(o);
! return o;
! }


Du coup, l'opérateur
ostream& operator<<(ostream& o, OBOParser const& p)
n'est plus nécessaire.

Falk