Dans le livre La bibliothèque standard C++ à la page 91 J'ai lu ceci à propos de shared_from_this()
:
Le problème est que
shared_ptr
Se stocke dans un membre privé de la classe de base dePerson
,enable_shared_from_this<>
, à la fin de la construction de la Personne.
L'extrait de code pertinent du livre est:
class Person : public std::enable_shared_from_this<Person> {
...
};
Je ne comprends pas deux choses ici:
shared_ptr
qui se stocke?Person
? Je pense que la construction de Person
se termine par la dernière déclaration de son constructeur qui a été écrite par moi.Je comprends qu'il y a weak_ptr
Qui n'a pas encore été initialisé.
EDIT: Merci à Angew! shared_from_this
Ne fonctionnera qu'après la création de shared_ptr
À Person
. Ce shared_ptr
Vérifiera si la classe Person
a hérité de enable_shared_from_this
, Et si oui, initialisez son weak_ptr
Interne.
La raison est simple: dans l'objet X
, enable_shared_from_this
Fonctionne en initialisant un weak_ptr
Caché avec une copie du premier shared_ptr
Qui pointe vers l'objet X
. Cependant, pour qu'un shared_ptr
Puisse pointer vers X
, X
doit déjà exister (il doit déjà être construit). Par conséquent, pendant que le constructeur de X
est en cours d'exécution, il n'y a pas encore de shared_ptr
Que enable_shared_from_this
Pourrait utiliser.
Prenez ce morceau de code:
std::shared_ptr<Person> p(new Person());
Avant même d'appeler le constructeur de p
(de shared_ptr
), Son argument doit être évalué. Cet argument est l'expression new Person()
. Par conséquent, le constructeur de Person
s'exécute avant même que le constructeur de p
ait commencé - avant qu'il n'y ait un objet shared_ptr
Auquel enable_shared_from_this
Pourrait se lier.