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 averti
    Inscrit en
    F�vrier 2010
    Messages
    27
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2010
    Messages : 27
    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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 297
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 297
    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;
    }

  3. #3
    Membre exp�riment�

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    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.

  4. #4
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 297
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 297
    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

  7. #7
    Membre averti
    Inscrit en
    F�vrier 2010
    Messages
    27
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2010
    Messages : 27
    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