Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Melewati `std::shared_ptr` `this` dengan Selamat kepada Objek Berkaitan?

Bagaimanakah Saya Boleh Melewati `std::shared_ptr` `this` dengan Selamat kepada Objek Berkaitan?

DDD
Lepaskan: 2024-10-28 21:01:30
asal
899 orang telah melayarinya

How Can I Safely Pass a `std::shared_ptr` of `this` to a Related Object?

Memahami Dilema "std::shared_ptr of this"

Dalam penggunaan penunjuk pintar, selalunya senario timbul di mana dua objek berkaitan, A dan B, memerlukan akses kepada antara satu sama lain. Walau bagaimanapun, melepasi std::shared_ptr untuk mewujudkan sambungan ini menjadi mencabar.

Sebagai contoh, pertimbangkan kelas A, induk, yang perlu menambah objek anak B. Kaedah addChild ibu bapa sepatutnya lulus std:: shared_ptr kepada anak, jadi ia boleh merujuk ibu bapa.

Walau bagaimanapun, percubaan anak langsung->setParent(ini) gagal kerana penunjuk ini adalah rnilai. Untuk menyelesaikan masalah ini, C menawarkan std::enable_shared_from_this.

Penyelesaian: std::enable_shared_from_this

std::enable_shared_from_this ialah templat kelas yang memudahkan perkongsian objek melalui std_ptr:.:share Dengan mewarisi daripadanya, anda mendapat akses kepada shared_from_this(), yang menyediakan std::shared_ptr yang diperlukan, seperti yang dilihat dalam kod yang diubah suai:

<code class="cpp">class A : public std::enable_shared_from_this<A> {
...
child->setParent(shared_from_this()); // now valid
};</code>
Salin selepas log masuk

Selain itu, untuk mengelakkan kebergantungan bulat yang boleh membawa kepada kebocoran memori , dinasihatkan menggunakan std::weak_ptr untuk kanak-kanak yang bergantung pada kewujudan ibu bapa mereka:

<code class="cpp">std::list<std::weak_ptr<B>> children; // now using weak_ptr</code>
Salin selepas log masuk

Langkah Berjaga-jaga

Perlu ambil perhatian bahawa .shared_from_this() hanya perlu dipanggil semasa panggilan objek diurus oleh std::shared_ptr. Ini bermakna ia tidak boleh dibuat pada tindanan dan biasanya tidak boleh dipanggil dalam pembina atau pemusnah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melewati `std::shared_ptr` `this` dengan Selamat kepada Objek Berkaitan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan