Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh menghantar `std::shared_ptr` dengan selamat daripada \'ini\' daripada objek induk kepada objek anaknya dalam C ?

Bagaimanakah saya boleh menghantar `std::shared_ptr` dengan selamat daripada \'ini\' daripada objek induk kepada objek anaknya dalam C ?

Susan Sarandon
Lepaskan: 2024-10-29 13:12:29
asal
952 orang telah melayarinya

How can I safely pass a `std::shared_ptr` of

Cara Menggunakan std::shared_ptr untuk Lulus Rujukan "ini"

Dalam pengaturcaraan berorientasikan objek, ia adalah perkara biasa untuk objek untuk mengekalkan hubungan antara satu sama lain. Ini selalunya melibatkan objek yang memegang rujukan antara satu sama lain, membenarkan komunikasi dan perkongsian data. Satu cara untuk mengurus rujukan objek dalam C ialah melalui penggunaan penunjuk pintar, terutamanya std::shared_ptr.

Pertimbangkan senario hipotesis di mana kelas A memegang senarai rujukan std::shared_ptr kepada objek kelas B, di mana setiap objek B juga perlu memegang rujukan kepada induknya objek A. Ini menimbulkan cabaran: bagaimanakah kelas A boleh lulus std::shared_ptr sendiri (ini) dengan selamat kepada anaknya B?

Pendekatan mudah mungkin ialah mencuba sesuatu seperti child->setParent(this); , tetapi ini tidak betul kerana ini bukan std::shared_ptr yang sah. Penyelesaiannya terletak pada penggunaan std::enable_shared_from_this.

Memperkenalkan std::enable_shared_from_this

std::enable_shared_from_this ialah kelas asas yang membenarkan std. ::shared_ptr rujukan kepada diri mereka sendiri. Dengan mewarisi daripada std::enable_shared_from_this, kelas A mendapat kebolehan untuk memanggil .shared_from_this() untuk mendapatkan penuding dikongsi ke contoh sendiri.

Penyelesaian Menggunakan std::enable_shared_from_this

Dalam kod yang diubah suai di bawah, kelas A dibuat untuk mewarisi daripada std::enable_shared_from_this, dan panggilan anak->setParent() kini menggunakan .shared_from_this():

<code class="cpp">class A : public std::enable_shared_from_this<A>
{
public:
    void addChild(std::shared_ptr<B> child)
    {
        children.push_back(child);
        child->setParent(shared_from_this());
    }

private:
    // Note the use of std::weak_ptr here
    std::list<std::weak_ptr<B>> children;
};</code>
Salin selepas log masuk

Dalam kemas kini ini kod:
  • Kelas A mewarisi daripada std::enable_shared_from_this, mendayakan penggunaan .shared_from_this().
  • .shared_from_this() mengembalikan penuding kongsi kepada instance kelas A, yang kemudiannya selamat dihantar ke objek B.
  • std::weak_ptr digunakan untuk senarai kanak-kanak dalam kelas A untuk mengelakkan kebergantungan bulat dan mengelakkan kebocoran sumber.

Pendekatan ini menyelesaikan masalah menghantar std::shared_ptr "ini" daripada objek A induk kepada objek B anaknya. Dengan menggunakan std::enable_shared_from_this dan menguruskan kebergantungan bulat dengan std::weak_ptr, mekanisme perkongsian rujukan yang selamat dan berkesan dicapai.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menghantar `std::shared_ptr` dengan selamat daripada \'ini\' daripada objek induk kepada objek anaknya dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan