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 :

fstream dans une classe


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut fstream dans une classe
    Salut,
    j'ai un problème de déclaration de fstream (accès écriture et lecture d'un fichier) dans une classe
    en gros:

    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
     
    A.h
     
    classe A
    {
    private:
    fstream file;
     
    public
    A(string& filename);
    }
     
    A.cpp
     
    A::A(string& filename)
    {
    file.open(filename); // peut etre qu'il faut un petit .c_str() mais la n'est pas le probleme.
    }
    Donc, mon probleme, c'est qu'a la compile il me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error: field 'file' has incomplete type //en pointant sur la ligne déclaration du .h
    du coup je ne sais pas comment declarer mon fstream :/
    merci d'avance
    dom
    ps: j'ai bien chercher dans des refs ou des tutos, mais ils ne parlent pas de declaration dans un classe.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    En remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
    file fstream;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
    fstream file;
    ça ne fonctionne pas mieux ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    merci mabu mais en fait cette erreur n'existe que sur mon exemple (ouf) (mais c'est bien mon genre de tout façons )
    (je corrige de suite) mon probleme est toujours la...
    mais ya t il une regle pour declarer un fstream dans une classe? a prioris il faut le definir tout de suite mais, je veux pouvoir instencier ma classe plusierus fois avec un fichier different je trouve ca louche, est ce que la declaration d'un fstream dans une classe pause probleme en general ou pas du tout?

  4. #4
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    #include <fstream> avec std:: devant et ca ira mieux.
    Car tu essaie de créer un objet complet de type fstream. Pour y arriver, il faut que tout la déclaration de la classe soit connu. On connait cette déclaration via l'inclusion de l'en tête.

    Donc ton code devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //A.h
    #include <fstream>
    classe A
    {
    private:
    std::fstream file;
     
    public
    A(std::string& filename);
    }
    "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)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    oh la la la.... le boulet.... quand je disais que c'etait bien mon genre....
    merci Davidbrcz!! (beaucoup!)
    promis j'arrete ... enfin j'essaye!
    dom

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Hum comment se fait il qu'il faille std:: pour fstream, mais pas pour string ??

    Sinon, aux erreurs de recopie pres, je n'ai pas de problème avec :

    Code fs.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A
    {
    private:
    fstream file;
     
    public:
    A(string& filename);
    };

    Code fs.cc : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <fstream>
    #include <string>
    using namespace std;
    #include "fs.h"
     
    A::A(string& filename)
    {
    file.open(filename.c_str()); // peut etre qu'il faut un petit .c_str() mais la n'est pas le probleme.
    }

  7. #7
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Hum comment se fait il qu'il faille std:: pour fstream, mais pas pour string ??
    L'inattention, je corrige.

    Sinon mabu pour ton 2eme code, c'est normal car le pre-processeur copie et colle le code qu'on lui dit d'inclure. Avec les inclusions que tu fait avant et le using, ca passe mais si tu le faisait pas, ca casserai. De plus, tu brise la règle comme moi tout fichier doit être indépendant.
    "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)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    mabu, j'avais juste fait un code basique representant le schema de vrai code, et il se trouve que j'avais oublié d'inclure fstream, mais string y est lui
    merci encore!!!
    A+ (tard )
    dom

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Au passage, ta référence vers string devrait être une référence constante.
    Ou mieux, prendre directement un char const *, puisque c'est ce que demande fstream. Ça évitera, si tu appelles ta classe avec une chaîne littérale, de créer une std::string pour rien...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    il faut que je m'oblige a utiliser const, il est seulement la pour proteger le contenu? ou il y a un coté performance ou autre a prendre en compte? sinon c'est vrai qu'un char const * serait plus judicieux une conversion de moins a faire .
    ++

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Dans le cas présent, c'est surtout parce que le C++ n'accepte pas les références non-constantes vers les temporaires non-nommées, tu n'aurais donc carrément pas pu appeler ton constructeur avec une chaîne littérale...

    Mais oui, la const-correctness est importante. Pas seulement pour protéger tes données, mais aussi pour faciliter la lecture du code (une référence const vers un objet accentue le fait que c'est un paramètre en entrée et surtout pas en sortie, etc.)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    ok merci pour ces conseils, je vais tacher de les appliquer
    A+ dom

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/07/2005, 23h10
  2. classe dans une classe ?
    Par tut dans le forum UML
    Réponses: 23
    Dernier message: 25/06/2004, 15h00
  3. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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