Handle non propriétaire sur un objet optionnel en C++ moderne

a marqué ce sujet comme résolu.

Salut, je me suis rendu compte en écrivant le cours de C++ que je ne savais pas quelle est la meilleure manière d’avoir un handle optionnel non propriétaire sur un objet. Quelle solution utilisez-vous ?

Avant, j’utilisais des pointeurs nus, mais il y a plein d’autres options bien moins "dangeureuses" que j’envisage : std::optional<std::reference_wrapper<T>>, boost::optional<T&>, …

Mais du coup, pour le cours, j’aimerais bien savoir s’il y a une option qui se démarque et qui est celle employée le plus régulièrement.

Je trouve ça assez grave pour un auteur de cours C++ que je ne connaisse pas la meilleure manière de répondre à un problème aussi commun, mais bon, il faut bien se renseigner un jour ! ^^

Merci d’avance !

+0 -0

Lu’!

Pour un accès optionnel non propriétaire, le pointeur nu suffit bien. De toute façon, les optionnals ne seront pas capables non plus de détecter que l’élément est devenu dangling, donc ils apportent une couche de complexité pour rien.

Je pose ça là : https://zestedesavoir.com/forums/sujet/9371/segfault-avec-des-variables-temporaires/?page=1#p162633

Pour un accès optionnel non propriétaire, le pointeur nu suffit bien. De toute façon, les optionnals ne seront pas capables non plus de détecter que l’élément est devenu dangling, donc ils apportent une couche de complexité pour rien.

Ksass`Peuk

Ça c’est sûr, mais au moins ils évitent d’exposer les opérations arithmétiques, la suppression, etc… Après, c’est vrai que c’est un détail qui ne nécessite pas forcément d’ajouter autant de complexité. D’autant qu’on peut facilement se dire qu’on n’utilisera pas ses opérations. Du coup je vais rester sur mes bons vieux pointeurs nus. Y a pas des discussions pour déprécier les pointeurs nus d’ailleurs ?

+0 -0

D’autant qu’on peut facilement se dire qu’on n’utilisera pas ses opérations.

mehdidou99

Et elles sont faciles à détecter.

Y a pas des discussions pour déprécier les pointeurs nus d’ailleurs ?

mehdidou99

C’était un troll, si je me souviens bien. De toute façon, il y a tellement de dissensions dans le commité C++ qu’on pourrait l’utiliser comme base pour un épisode de game of thrones.

Le plus gros avantage à ne pas utiliser un pointeur nu est que ça indique clairement (sans nécessiter de commentaires) qui est le propriétaire ou plus exactement qui ne l’est pas. D’un autre côté, si tu utilises une convention qui dit qu’un pointeur nu n’est jamais propriétaire, utiliser un pointeur nu est probablement la solution la plus simple.

Le plus gros avantage à ne pas utiliser un pointeur nu est que ça indique clairement (sans nécessiter de commentaires) qui est le propriétaire ou plus exactement qui ne l’est pas. D’un autre côté, si tu utilises une convention qui dit qu’un pointeur nu n’est jamais propriétaire, utiliser un pointeur nu est probablement la solution la plus simple.

Berdes
template<typename T>
using NonOwnerPtr = T*;

weak_ptr ?

lmghs

Quand y a un unique propriétaire, je préfère unique_ptr pour l’owner et raw pointer pour les autres que weak et shared. Pas toi?

+0 -0

Ça c’est sûr, mais au moins ils évitent d’exposer les opérations arithmétiques, la suppression, etc…

mehdidou99

C’est le genre de chose que tu peux faire faire en exercice.

  • dans le cours : utilisation de pointeurs nus. Ajouter un alias de type pour l’expressivité, mais en expliquant que c’est un typage faible
  • en exo : ecrire une classe qui fait la meme chose, mais avec un typage fort

Et plus generalement, quand on a une solution qui est simple (ici, un wrapper sur un pointeur nu), mais qui n’est pas directement dispo en C++, c’est le genre de chose a faire faire en exo.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte