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

SL & STL C++ Discussion :

[flux] héritage combiné d'ifstream et d'ofstream


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3
    Par défaut [flux] héritage combiné d'ifstream et d'ofstream
    Bonjour à tous : je me permets de poster ce sujet sur Developpez.com après l'avoir posté sur d'autres forums car je suis très intrigué par mon problème.

    Voilà, j'ai un souci avec une classe 'texte' lisant dans un fichier et écrivant dans un autre :

    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
     
    #include <fstream>
    #include <iostream>
    using namespace std;
     
    class texte : public ifstream, public ofstream   
    {
        public:
        texte(void) : ifstream("in.txt"), ofstream("out.txt")
        {}
    };
     
    int main(void)
    {
        texte t;
        int c = t.ifstream::get();
        cout << c << "\n";        
    }
    A l'exécution le programme m'affiche '-1' ce qui montre que le flux d'entrée n'est pas valide. Par contre si ma classe 'texte' n'hérite que d' ifstream (sans hériter d'ofstream, donc) la lecture est correcte.
    Pourquoi le méchanisme d'héritage ofstream -> texte bloque-t-il mon flux d'entrée ?
    Merci d'avance à ceux qui me liront.

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ou lala. Je ne saurais pas te dire pourquoi c'est pas bon, mais ça nze m'étonne pas que ça soit le cas. Connais-tu fstream ?
    Mais surtout ta relation d'héritage est mauvaise. Utilise la composition, surtout si tu écris des choses comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int c = t.ifstream::get();

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Hum...m'est avis que ce n'est pas ainsi que l'on procède.
    Tente une recherche sur "deriving stream c++" dans google. Tu devrais trouver la bonne façon pour procéder.

    Sinon, j'imagine qu'ici tu mélanges des choses différentes dans ta classe.

    Investir dans le bouquin de Klaus Kreft et Angelika Langer peut être une bonne chose.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3
    Par défaut
    Merci à Luc et à Aurélien pour ces réponse très rapides... même si je ne comprends pas comme vous ce qui ne marche pas ! J'ai en effet trouvé à l'adresse suivante de quoi me satisfaire :

    Deriving the C++ Stream Buffer :
    http://spec.winprog.org/streams/

    Voici pourquoi je vous ai posé cette question :
    Je cherche à développer une surcouche d'istream et d'ostream pour gérer l'unicode et une sur-sur-couche pour gérer un format personnel ('infotexte'). Il ne s'agit donc pas seulement d'utiliser des fichiers !
    Je pensais donc faire la hiérarchie de classes suivante :

    flux_in -> istream
    flux_out -> ostream
    texte -> flux_in, flux_out

    Après bien des erreurs, je me suis rendu compte qu'en effet quelque-chose clochait, d'où mon topic.
    Dans tous les cas, merci pour tout. Je vais lire l'article à l'adresse indiquée. Si je parviens à mes fins sans utiliser la composition je vous fais signe et ferai circuler mon code.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    Tu t'attaques là à l'héritage multiple, ce qui est casse gueule si tu ne connais pas bien la hiérarchie de classe. En l'occurence, ifstream et ofstream derivent (indirectement) toutes les 2 d'une même classe ios. Ainsi vont apparaître des problême de redondance des données-membres.

    Je ne serais que trop te conseiller le livre de Géron et Tawbi, "Pour mieux programmer en C++", qui traite, entre autre, de l'héritage multiple et de ses problèmes.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Je savais bien que j'avais vu un truc en français sur le sujet.
    Dans la FAQ de fclc++.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. std::ifstream et std::ofstream::close();
    Par nikopol82 dans le forum SL & STL
    Réponses: 3
    Dernier message: 02/02/2009, 10h42
  2. Réponses: 22
    Dernier message: 17/07/2008, 09h51
  3. utiliser ifstream et ofstream successivement
    Par pit9.76 dans le forum SL & STL
    Réponses: 2
    Dernier message: 01/04/2006, 17h48
  4. Réponses: 9
    Dernier message: 04/10/2005, 19h26
  5. [Java] Héritage et flux d'Objet
    Par guejo dans le forum CORBA
    Réponses: 2
    Dernier message: 22/02/2005, 11h14

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