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 :

Partager ressource entre objets


Sujet :

C++

  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 : 16
    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 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 463
    Points : 16 213
    Points
    16 213
    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.

  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 : 16
    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
    5 195
    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 : 5 195
    Points : 17 163
    Points
    17 163
    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)

+ 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, 14h12
  2. Partager une ressource entre composants
    Par Alchemist dans le forum Delphi
    Réponses: 11
    Dernier message: 05/02/2007, 12h03
  3. Partage d'objet entre objet
    Par oxor3 dans le forum CORBA
    Réponses: 1
    Dernier message: 08/09/2006, 22h00
  4. Comment partager les ressources entre 2 threads?
    Par remimichot dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 29/12/2005, 09h17
  5. partager ressource entre deux process
    Par buzzz dans le forum Windows
    Réponses: 6
    Dernier message: 16/02/2005, 10h36

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