Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencegah Ketergantungan Pekeliling Apabila Menggunakan std::shared_ptr daripada \'ini\'?

Bagaimana untuk Mencegah Ketergantungan Pekeliling Apabila Menggunakan std::shared_ptr daripada \'ini\'?

Linda Hamilton
Linda Hamiltonasal
2024-10-29 04:43:29577semak imbas

How to Prevent Circular Dependencies When Using std::shared_ptr of

std::shared_ptr of "this": Memahami Kebergantungan Pekeliling

Mewarisi daripada std::enable_shared_from_this ialah kunci untuk menyelesaikan "std ::shared_ptr of this" teka-teki. Dengan mendayakan ini, anda boleh menggunakan .shared_from_this() untuk mendapatkan penuding dikongsi ke objek semasa. Walau bagaimanapun, ini memperkenalkan potensi pergantungan bulat antara objek ibu bapa dan anak.

Untuk menangani isu ini, disyorkan untuk menggunakan std::weak_ptr untuk rujukan anak kepada ibu bapa. Ini menghalang pembentukan rujukan bulat yang kuat dan melindungi daripada kebocoran sumber. Kod yang diubah suai menunjukkan cara untuk melaksanakan pendekatan ini:

<br>kelas A : public std::enable_shared_from_this<a> {<br>awam:</a></p>
<pre class="brush:php;toolbar:false">void addChild(std::shared_ptr<B> child) {
    children.push_back(child);
    child->setParent(shared_from_this());
}

pribadi :

std::list<std::weak_ptr<B>> children;

};

kelas B {
awam:

void setParent(std::shared_ptr<A> parent) {
    this->parent = parent;
}

peribadi:

std::shared_ptr<A> parent;

};

Adalah penting untuk ambil perhatian bahawa memanggil .shared_from_this() memerlukan objek semasa diurus oleh std::shared_ptr pada masa panggilan. Ini menunjukkan bahawa mencipta objek sedemikian pada tindanan tidak lagi boleh dilakukan dan memanggil .shared_from_this() daripada pembina atau pemusnah biasanya tidak disyorkan.

Atas ialah kandungan terperinci Bagaimana untuk Mencegah Ketergantungan Pekeliling Apabila Menggunakan std::shared_ptr daripada \'ini\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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