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 :

Référencement d'un objet, sans responsabilité vis-à-vis de cet objet


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut Référencement d'un objet, sans responsabilité vis-à-vis de cet objet
    Bonjour,

    J'ai besoin d'une entité qui fasse référence à un objet dont la durée de vie excède celle de l'entité en question.
    Autrement dit, mon entité doit faire référence à un objet déjà existant, et n'avoir aucune responsabilité quant à sa destruction (l'objet peut être statique).
    Je crois qu'on peut dire que la seule responsabilité de l'entité est d'encapsuler la ressource référencée, et de masquer le mécanisme de référencement.
    Mais il se peut qu'à un moment du programme, l'entité n'aie pas d'objet à référencer.

    En C++98, j'utilisais des pointeurs nus.
    D'après ce que j'ai compris, il vaut mieux éviter d'utiliser les pointeurs nus.
    (À moins que ce cas précis soit l'un des rares ou l'utilisation des pointeurs nus n'est pas déconseillée...)

    Avec l'arrivée du C++11, je me tourne naturellement vers std::reference_wrapper.
    Ça référence un objet existant, ça ne s'occupe pas de sa destruction, et on peut même changer d'objet référencé en cours de route.
    Sauf que la référence doit toujours être valide.

    Bon... peut-être du côté de std::weak_pointer ?
    D'après ce que j'ai compris, c'est comme std::reference_wrapper, excepté pour le point qui me gênait (et ça s'utilise comme un pointeur et non pas comme une référence) : ils peuvent être expired, si je ne me trompe pas.
    Sauf qu'un ne peut construire un std::weak_pointer qu'à partir d'un autre std::weak_pointer ou d'un std::shared_pointer, et les std::shared_pointer ont la responsabilité de détruire les objets qu'ils référencent.

    Est-ce que par hasard quelqu'un connaîtrait une classe qui serait une sorte de mix entre std::reference_wrapper et std::weak_pointer (dans la bibliothèque standard, j'entends), ou je dois la faire moi-même ?
    Je me doute bien que ce ne doit pas être très compliqué, mais ce serait idiot de réinventer la roue...

  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 : 49
    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
    L'intérêt du weak_ptr est de pouvoir savoir si l'objet pointé existe toujours, la contrepartie est qu'il faut que la durée de vie de l'objet soit gérée par shared_ptr.

    Si tu es dans le cas où tu es certain de par la conception de ton programme que l'objet sera vivant plus longtemps que le pointeur pointant dessus, tu es dans le dernier cas où j'utiliserais un pointeur nu. Il ne te servirait à rien de le wrapper, tu n'y gagnerais a priori rien en terme de fonctionnalité...
    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
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    De plus, je me dis que, s'il peut ne pas y avoir d'objet référencé (le cas d'un "parent", qui peut ne pas exister pour la racine ), il n'existe aucun mécanisme pour s'assurer qu'une référence est valide et donc aucun moyen de le tester .
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Très bien, merci.

    Pour info, les objets référencés sont stockés dans des conteneurs au début du programme, et on ne retire rien de ces conteneurs jusqu'à leur destruction en fin de programme.
    [Edit]Lesdits conteneurs sont propriétaires des objets qu'ils stockent, donc sont entre autres responsables de leur destruction.[/Edit]

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

Discussions similaires

  1. Trier des objets sans Comparable
    Par Shabata dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 13/03/2006, 13h55
  2. Réponses: 2
    Dernier message: 05/02/2006, 21h19
  3. Fenêtre modale vis à vis de la fenêtre appelante
    Par hroz dans le forum Composants VCL
    Réponses: 1
    Dernier message: 08/11/2005, 14h33
  4. [GRASP] Responsabilité de création d'un objet
    Par Royd938 dans le forum Design Patterns
    Réponses: 12
    Dernier message: 29/06/2005, 10h02
  5. indépendance vis à vis de ODBC
    Par ka0z dans le forum ASP
    Réponses: 2
    Dernier message: 08/06/2004, 16h56

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