France Hardware : Forums de discussion
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
23 285 membres enregistrés - 1 904 120 posts - 98 196 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Sujets divers
                surdefinition des operateurs de flux, en particuler <<
41 connectés(record : 207 le 05 juin 2007 - 05 h 23)

Vous devez vous connecter pour répondre au topic.
surdefinition des operateurs de flux, en particuler <<

Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 20 juin 2005 - 15 h 51 m 05 s
Bonjour,

Comme annoncé dans le titre j'ai créé une classe qui surdefinie <<. Pour cela je l'ai fait dériver de streambuf et ostream.

Tout ce passe correctement lorsque j'utilise 1 <<. Si je les place en cascade, je ne recupere pas la chaine totale mais la surchage de l'operateur << est executée pour chaque cascade.

J'ai veinement cherche de la doc sur google mais tres peu de sites traitent de la surcharge des operateurs de flux. Et encore moins l'abordent en profondeur. Par contre les bases du langage 'y en a des tonnes!
J'ai qqs livre sur C++ mais cette notion est aussi tres peu expliquée.

Si qq'un connait une url ou peut m'expliquer à l'aide d'un exemple, je suis preneur.

Merci d'avance pour vos remarques.
--
Gosseyn



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 20 juin 2005 - 17 h 09 m 43 s
Je ne suis pas sûr de suivre... Tu peux laisser un bout de code en pointant le problème ? Je me suis un peu amusé à surcharger <<, moi aussi, je vais peut-être pouvoir t'aider !



Huile de fraise.

Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 20 juin 2005 - 17 h 58 m 58 s
En fait je voudrais etendre les fonctionnalités de clog pour qu'il envoit les données au daemon syslod (sous Unix/linux).
par exemple:
mylog(facility, errorLevel) << "problem: " << "ben alors!" << endl;
ou bien
mylog(errorLevel) << "problem: " << "ben alors!" << endl;
ou encore
mylog<< "problem: " << "ben alors!" << endl;

Je simplifie mais la declaration est comme cela:

class mylog {
MyLog &operator()(string p_ident, Class p_class= classUser, Level p_level = levelError);
MyLog &operator()(Level p_level);
MyLog &operator<<(const string&);
};

la surdefinition de l'operateur () intialise des variables de la classe et << appel la fonction syslog(). Lorsque l'on place des "<<" en cascade, syslog est appelé plusieurs fois donc plusieurs lignes dans le fichier de log au lieu d'avoir une seule et meme entrée/ligne.

J'ai tenté de dériver
class MyLog : protected std::streambuf, public std::ostream mais je n'ai pas bcp avancé car si la classe supporte maintenant les '<<' en cascades, je ne sais pas comment récupérer la chaine finale.
Actuellement je m'oriente plutot sur strstream et associée.



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 20 juin 2005 - 22 h 24 m 57 s
Je suppose que ce n'est pas vraiment les streams standards qui t'intéressent - tu veux juste passer du texte (paramétré) à syslog() ? Tu peux dériver de std::stringstream (dans <sstream>), qui proposent la méthode "str()" qui renvoie la string associée au flux. Dans le destructeur, appelle syslog avec le texte retourné par str().c_str(), et hop !
Tu as juste à ajouter des variables membres qui stockent les différents paramètres pour syslog et la forme à utiliser, variables qui sont initialisées par le contructeur. Tu n'as alors plus besoin de l'opérateur ().

edit 19: un inconvénient à tout ça, c'est que tu construis et détruis un objet à chaque fois que tu entres un ligne de journal...


Message édité 8 fois, la dernière par Petit_PimoOosE le 21 juin 2005 - 04 h 33.

Huile de fraise.

Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 21 juin 2005 - 13 h 42 m 29 s
Récupérer la chaine dans le destructeur implique que l'objet doit etre detruit pour que le log soit ecrit. Il faut donc le placer dans un bloc de code assez petit ou appelé explicitement "delete". J'ai un peu "peur" de louper des logs avec ça.

J'ai tenté de surdefiir la methode stringbuf::overflow() qui est appelé lors d'un <<. Cela evitait d'attendre le destructeur pour récupérer la chaine mais sans succés jusqu'à present.

Je pense que je vais me contenter d'un << sans offrir la possiblité de les mettre en cascade pour l'instant. Je voyais aussi cette classe comme un moyen de travailler avec les flots mais cela reste assez complexe pour créer ses propres classes les exploitant en partculier si on veut récupérer la chaine de caractère.
Merci de ton aide.



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 21 juin 2005 - 16 h 56 m 17 s
Tu pourrais aussi (re)définir un modificateur de flux, comme flush, qui serait appelé dans le destructeur ou quand tu le précises.



Huile de fraise.

Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 21 juin 2005 - 17 h 51 m 47 s
oui, j'y ai aussi pensé mais s'il faut appeler une fonction apres le "<<", cela presente moins d'interet. Autant appeler directement une fonction qui ecrit dans les logs.... Je pense avoir trouvé un compromis entre l'objectif (faire comme clog) et mes compétences techniques me permettant de l'atteindre. ;-)



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 21 juin 2005 - 18 h 40 m 18 s
Je n'ai jamais utilisé clog, mais il me semble qu'il n'est pas tamponné, donc à chaque <<, un bout de chaîne est envoyé.



Huile de fraise.

Gosseyn


Messages : 286
Inscrit le 24/01/05
Ville : Grenoble
Non connecté
  Posté le 22 juin 2005 - 10 h 21 m 32 s
sauf erreur ma part, clog EST tamponné. C'est ce qui le différencie de cerr.

http://developers.sun.com/tools/cc/documentation/ss10_docs/mr/man3c++/clog.3.html



"Si vous perdez, ne perdez pas la leçon."
Gosseyn


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 22 juin 2005 - 16 h 08 m 09 s
:dd: on dirait bien que j'ai confondu



Huile de fraise.

Page genérée en 0.3248 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL |Actualité ADSL | e-commerce | Commande Au Volant
Creative Commons
Message Boards and Forums Directory