web-dev-qa-db-fra.com

Comment faire pointer l'objet par un pointeur partagé?

J'ai une question. Pouvons-nous obtenir directement l'objet vers lequel pointe un pointeur partagé? Ou devrions-nous obtenir le pointeur RAW sous-jacent via l'appel get() puis accéder à l'objet correspondant?

31
Pavan Dittakavi

Vous avez deux options pour récupérer une référence à l'objet pointé par un shared_ptr. Supposons que vous ayez une variable shared_ptr Nommée ptr. Vous pouvez obtenir la référence en utilisant *ptr Ou *ptr.get(). Ces 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 Se lit "Obtenez-moi les données pointées par ptr", tandis que l'expression *ptr.get() "Obtenez-moi les données pointées par le pointeur brut qui est enveloppé à l'intérieur ptr ". De toute évidence, le premier décrit votre intention beaucoup plus clairement.

Une autre raison est que shared_ptr::get() est destiné à être utilisé dans un scénario où vous avez réellement besoin accès au pointeur brut. Dans votre cas, vous n'en avez pas besoin, alors ne le demandez pas. Ignorez simplement le pointeur brut et continuez à vivre dans votre monde shared_ptr Plus sûr.

52

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

Je voudrais juste ajouter que vous pouvez également utiliser le -> opérateur directement sur un shared_ptr pour accéder aux membres de l'objet vers lequel il pointe.

Le booster la documentation donne un bon aperçu.

ÉDITER

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

16
jakar