43 votes

Comment obtenir l'objet pointé par un pointeur partagé ?

J'ai une question. Peut-on obtenir directement l'objet sur lequel pointe un pointeur partagé ? Ou doit-on obtenir le pointeur RAW sous-jacent par l'intermédiaire de get() et ensuite accéder à l'objet correspondant ?

79voto

Ken Wayne VanderLinde Points 9054

Vous disposez de deux options pour récupérer une référence à l'objet pointé par un fichier shared_ptr . Supposons que vous ayez un shared_ptr variable nommée ptr . Vous pouvez obtenir la référence soit en utilisant *ptr o *ptr.get() . Les deux devraient être équivalents, mais le premier serait préféré.

La raison en est que vous essayez vraiment d'imiter l'opération de déréférencement d'un pointeur brut. L'expression *ptr lit "Obtenez-moi les données pointées par ptr ", alors que l'expression *ptr.get() "Obtenez-moi les données pointées par le pointeur brut qui est enveloppé à l'intérieur de ptr ". Il est clair que la première décrit beaucoup mieux votre intention.

Une autre raison est que shared_ptr::get() est destiné à être utilisé dans un scénario où vous avez effectivement besoin de l'accès au pointeur brut. Dans votre cas, vous n'en avez pas besoin, donc ne le demandez pas. Laissez tomber le pointeur brut et continuez à vivre dans votre coffre-fort. shared_ptr monde.

22voto

jakar Points 392

Réponse de Ken ci-dessus (ou en dessous, selon la façon dont ils sont classés) est formidable. Je n'ai pas assez de réputation pour commenter, sinon je le ferais.

J'aimerais juste ajouter que vous pouvez également utiliser la fonction -> directement sur un shared_ptr pour accéder aux membres de l'objet vers lequel il pointe.

El documentation sur le boost donne un excellent aperçu.

EDITAR

Maintenant que C++11 est largement adopté, std::shared_ptr doit être préférée à la version Boost. Voir les opérateurs de déréférencement aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X