Salut,
J´aimerais initialiser une variable de type ofstream dans le constructeur par recopie d´un objet.
Comment dois-je faire pour que ma variable ofstream designe un autre flux?
J´espere aue je suis assez clair
Merci,
Mop!o
Salut,
J´aimerais initialiser une variable de type ofstream dans le constructeur par recopie d´un objet.
Comment dois-je faire pour que ma variable ofstream designe un autre flux?
J´espere aue je suis assez clair
Merci,
Mop!o
Pas trop, mais en dehors de ça le fonctionnement est exactement le même que pour un constructeur normal:
Maintenant, je sens que ce que tu voulais vraiment c'est faire en sorte que le stream soit en quelque sorte "copié". Et bien, c'est impossible et pour de très bonnes raisons.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class truc { ofstream machin; public: truc(const truc&): machin(les arguments que tu veux) {} };
Tous les streams sont incopiables, donc toutes les classes en contenant le sont aussi. Dans le cas des stringstreams par exemple il est possible de contourner ce fonctionnement (leur buffer interne est un string, il suffit donc d'initialiser un nouveau stream avec pour buffer une copie du premier buffer). Mais certainement pas pour des streams fichier, à plus forte raison si ils sont en écriture! La c'est tout ton OS qui te dira d'aller te faire voir.
Apparament ton idée est de créer une sorte de déviation, un stream qui redirigerait vers le premier. C'est possible mais c'est un bien mauvais mode de fonctionnement, qu'arrivera-t-il quand ton premier objet sera détruit?
Une solution viable serait d'utiliser un shared_ptr, la aucun risque de pointeur fantôme, mais je considérerais plutot ça comme une mauvaise technique de programmation, quel que soit le langage. En effet, il faut considérer un shared_ptr comme un garbage collector à comptage de réfèrence, c'est à dire que tu n'as aucune idée du moment où ton objet sera détruit. Ce n'est pas un problème pour les objets qui ne représente rien d'autre que des données (exemple: des images) mais ça l'est dans le cas d'un stream sur fichier, car c'est l'exemple type d'objet dont on voudrait connaitre le moment exact de destruction (pour que ton programme ou un autre puisse aller lire le fichier).
Alors mon avis: prends quelques minutes pour savoir si ton stream a vraiment quelque chose à faire dans ton objet (ce serait pas mieux de stocker le nom du fichier pour pouvoir instancier un stream en variable locale uniquement quand tu en as besoin?) et si c'est le cas, utilise un shared_ptr.
Merci pour les explications. Je l´ignorais.
→ C´est ce que j´ai fait, le stream dans la classe n´était pas vraiment nécessaire. Il passe en variable locale.Alors mon avis: prends quelques minutes pour savoir si ton stream a vraiment quelque chose à faire dans ton objet (ce serait pas mieux de stocker le nom du fichier pour pouvoir instancier un stream en variable locale uniquement quand tu en as besoin?)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager