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 :

copier un objet fstream


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 24
    Points
    24
    Par défaut copier un objet fstream
    Bonjour,

    J'ai un petit souci avec la recopie d'un objet fstream depuis le passage de VC6 à VC8:

    Une donnée membre _file était affectée de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class A
    {
    public:
        void SetFile(fstream *file);
     
    protected:
        fstream _file;
    };
     
    void A::SetFile(fstream * file)
    {
        _file = *file;
    }
    Sauf qu'apparemment l’opérateur = est devenu privé donc ça ne compile plus.

    Le projet en question est assez complexe, donc je ne souhaite pas pour le moment reprendre la conception, mais plutôt remplacer la ligne par quelque chose qui ferait le même job.

    J'ai pas trouvé mieux que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(&_file,file,sizeof(fstream));
    Avez-vous une meilleure idée?
    Merci

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    solution très moche, mais je ne vois pas faire autrement: passer ta variable membre _file de fstream à fstream &, et ta fonction sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _file = dynamic_cast<fstream&>( *file );
    Le fait d'avoir file_ en référence ne devrait pas changer le reste de ton code; sauf peut-être le constructeur.

    Pour faire quelque chose de propre, tu pourras ensuite modifier ta fonction ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void A::SetFile(fstream & file)
    {
        _file = file;
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    En C++ standard, les streams ne sont PAS copiables. Il ne faut surtout pas le faire. Visual C++ 6 est un compilateur qui est sorti en 1997 (avant la normalisation du langage). Il permet donc de faire des choses qui ne sont pas censées marcher en C++ normalisé.

    Je te conseille de revoir ta conception en conséquence (tout dépend de ce que tu veux faire), par exemple en stockant un pointeur ou un shared_ptr plutôt qu'une valeur.

    Quand à la "solution" memcpy, ça a 99,9 chances sur 100 de ne pas marcher. Mieux vaut ne pas l'utiliser.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Il me semblait que les fstream était non-copiable, nan?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    fstream n'est pas copiable effectivement.
    La solution de r0d ne marchera pas non plus, une référence doit être initialisée à sa déclaration.
    Tu peux par contre stocker le pointeur en interne, et le déférencer quand nécessaire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Bousk Voir le message
    La solution de r0d ne marchera pas non plus, une référence doit être initialisée à sa déclaration.
    Ca le forcera à faire du RAII, ce qui ne peut être que positif
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Niark13 Voir le message
    Je te conseille de revoir ta conception en conséquence (tout dépend de ce que tu veux faire)
    C'est justement ce que je voulais éviter. Un peu par flemme, mais surtout parce que c'est un projet (très) complexe que j'ai récupéré, que je ne maîtrise pas encore et je n'ai pas envie de "tout casser" pour le portage sous VC8.
    Mais si le code n'était pas bon à la base, et que vous ne voyez pas d'autre solution, je m'y résignerai.
    Je doit pouvoir changer la donnée membre en fstream& et modifier le constructeur sans poser trop de problèmes aux classes dérivées.

    edit:
    C'est fait. Après avoir modifié une bonne dizaines de classes pour pour propager le file dans les constructeurs, changé le type de _file en fstream& et ajouté une donnée membre fstream _fileDefault pour initialiser _file à qqch dans le constructeur sans file, ça a l'air de marcher.

    Merci à tous

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

Discussions similaires

  1. copier un objet (instance ?)
    Par panthere_noire dans le forum Général Python
    Réponses: 16
    Dernier message: 20/09/2008, 23h32
  2. Copier un objet en VB
    Par decondelite dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/09/2008, 13h05
  3. Copier un objet par valeur ?
    Par Totanne dans le forum VB.NET
    Réponses: 4
    Dernier message: 25/03/2008, 14h22
  4. [C#]Comment puis-je copier un objet ?
    Par lanuage dans le forum C#
    Réponses: 12
    Dernier message: 03/11/2006, 20h11
  5. Copier des objets d'un formulaire à un autre en VBA
    Par vincentdacol dans le forum Access
    Réponses: 1
    Dernier message: 24/04/2006, 14h18

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