本The C++ Standard Library で91ページshared_from_this()
についてこれを読みました:
問題は、
shared_ptr
がPerson
の基本クラスenable_shared_from_this<>
、at the endのPersonの構成のプライベートメンバーに自分自身を格納することです。
本の関連コードスニペットは次のとおりです。
class Person : public std::enable_shared_from_this<Person> {
...
};
ここでは2つのことを理解できません。
shared_ptr
は誰ですか?Person
の構築の終わりに、彼はどのようにして自分自身をどこに格納できますか? Person
の構築は、私が作成したコンストラクターの最後のステートメントで終わると思います。まだ初期化されていないweak_ptr
があることを理解しています。
編集:Angewに感謝! shared_from_this
は、最初のshared_ptr
〜Person
が作成された後にのみ機能します。このshared_ptr
は、Person
クラスがenable_shared_from_this
から継承されているかどうかを確認し、継承されている場合は内部weak_ptr
を初期化します。
理由は簡単です。オブジェクトX
で、_enable_shared_from_this
_は、オブジェクトX
を指す最初の_weak_ptr
_のコピーで非表示の_shared_ptr
_を初期化することで機能します。ただし、_shared_ptr
_がX
を指すことができるようにするには、X
がすでに存在している必要があります(すでに構築されている必要があります)。したがって、X
のコンストラクターの実行中は、_shared_ptr
_が使用できる_enable_shared_from_this
_はまだありません。
次のコードを見てください。
_std::shared_ptr<Person> p(new Person());
_
p
(_shared_ptr
_の)のコンストラクタが呼び出される前に、その引数を評価する必要があります。その引数は、式new Person()
です。したがって、Person
のコンストラクターは、p
のコンストラクターが始まる前、つまり_shared_ptr
_がバインドできる_enable_shared_from_this
_オブジェクトがなくなる前に実行されます。