1. #1
    Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 9
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : septembre 2017
    Messages : 4
    Points : 3
    Points
    3

    Par défaut Partager ressource entre objets

    Bonjour, je voudrais savoir si la méthode que j'adopte est sûre: merci d'avance.
    J'ai une class avec un constructeur qui en fonction de la présence d'un nom de fichier en paramètre va créer une poignée vers celui ci et stocker son pointeur en attribut. Je voudrais que le destructeur de cette class libère le fichier. Le soucis vient quand il s'agit de retourner ces objets, en effet le fichier va être ouvert dans la fonction et puis après le return l'objet va être copié donc l'autre aura aussi accès au même fichier mais comme l'objet temporaire du return va appeler le destructeur et fermer le fichier donc l'autre ne pourra plus y accéder.
    Du coup je sais plus comment faire, faudrait il faire du c-style en allouant dynamiquement l'objet pour ne manipuler qu'un pointeur et puis delete l'objet dans un manager de ses objets ?

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    5 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : août 2004
    Messages : 5 372
    Points : 15 051
    Points
    15 051

    Par défaut

    C'est l'âme du C++ moderne que tu touches là !

    Au retour de la fonction, l'objet n'est pas copié, mais déplacé, ce qui est une nuance importante. En effet, il n'y a pas besoin de partager le fichier entre deux objets, il y a juste besoin de le transférer de l'un à l'autre.

    Si tu utilises des classes bien conçues, tu n'as rien à faire pour ça (je ne sais pas trop ce que tu entends par "poignée"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MaClasse
    {
      std::ofstream monFichier;
    };
    Rien qu'en faisant ça, ta classe n'est pas copiable, mais elle est déplaçable, et tu peux donc écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaClasse créeClasse(std::string const &nomFichier)
    {
      MaClass résultat;
      // ...
      return résultat;
    }
    Si ta poignée est moins prête à l'emploi, tu peux :
    - Soit créer un type autour qui te permettra de la manipuler plus sûrement (regarde des docs sur les constructeurs de déplacement et opérations d'affectation par déplacement, ainsi que sur la règle des 5)
    - Soit utiliser quelquechose d'un peu moins customisé, mais déjà fait pour toi. std::unique_ptr Par exemple, pour un FILE*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class FileStarDeleter 
    {
      void operator[](FILE *f) {fclose(f);}
    };
     
    using FilePtr = std::unique_ptr<FILE, FileStarDeleter>;

    Si maintenant tu te rends compte qu'en fait, tu veux vraiment partager ton objet, il existe aussi std::shared_ptr pour ça.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 9
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : septembre 2017
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaClasse créeClasse(std::string const &nomFichier)
    {
      MaClass résultat;
      // ...
      return résultat;
    }
    en faisant ça il n'y aura pas un appel du destructeur ? je m'en vais essayer ça.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 982
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 982
    Points : 16 602
    Points
    16 602

    Par défaut

    Si, mais comme il y a d'abord appel au constructeur par déplacement (de la variable recevant la valeur de retour), le destructeur ne détruit qu'une coquille vide.

    (si le déplacement est correctement géré dans ofstream, ce qui est bien sûr le cas)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Partager ressources entre projets
    Par Gaetch dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 15/04/2011, 15h12
  2. Partager une ressource entre composants
    Par Alchemist dans le forum Delphi
    Réponses: 11
    Dernier message: 05/02/2007, 13h03
  3. Partage d'objet entre objet
    Par oxor3 dans le forum CORBA
    Réponses: 1
    Dernier message: 08/09/2006, 23h00
  4. Comment partager les ressources entre 2 threads?
    Par remimichot dans le forum Langage
    Réponses: 7
    Dernier message: 29/12/2005, 10h17
  5. partager ressource entre deux process
    Par buzzz dans le forum Windows
    Réponses: 6
    Dernier message: 16/02/2005, 11h36

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