Rumah >pembangunan bahagian belakang >C++ >Mengapa Anda Tidak Boleh Menggunakan `shared_from_this()` dalam Pembina?

Mengapa Anda Tidak Boleh Menggunakan `shared_from_this()` dalam Pembina?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-06 15:35:02596semak imbas

Why Can't You Use `shared_from_this()` in Constructors?

Memahami Had shared_from_this dalam Pembina

Seperti yang dinyatakan dalam petikan daripada "The C Standard Library," shared_from_this() menghadapi masalah teknikal had dalam pembina. Untuk memahami konsep ini, adalah penting untuk menyelidiki kerja dalaman shared_from_this().

Peranan Penunjuk Lemah dalam shared_from_this

shared_from_this() bergantung pada dalaman weak_ptr untuk mengekalkan rujukan yang lemah kepada objek yang dicipta. Penunjuk lemah ini kekal tidak dimulakan sehingga shared_ptr yang kukuh (shared_ptr yang memiliki objek) dicipta untuk objek. Hanya selepas shared_ptr pertama dibuat instantiated boleh enable_shared_from_this, kelas asas objek, mengakses shared_ptr ini dan memulakan weak_ptr.

Isu Masa Pembinaan

Kebergantungan ini pada shared_ptrs sedia ada menimbulkan masalah untuk pembina. Apabila pembina sedang dipanggil, tiada shared_ptr yang menunjuk ke objek yang sedang dibina wujud lagi. Oleh itu, semasa pembinaan, enable_shared_from_this tidak boleh memulakan weak_ptrnya, menyebabkan shared_from_this() tidak boleh digunakan dalam pembina.

Contoh untuk Penjelasan

Pertimbangkan coretan kod berikut:

class Person : public std::enable_shared_from_this<Person> {
   ...
};

std::shared_ptr<Person> p(new Person());

Dalam contoh ini, pembina Person() berjalan sebelum pembina p shared_ptr. Ini bermakna semasa pembina Person(), tiada shared_ptr yang menunjuk ke objek Person wujud, melarang enable_shared_from_this daripada memulakan weak_ptrnya dan menyebabkan shared_from_this() tidak boleh diakses dalam pembina.

Atas ialah kandungan terperinci Mengapa Anda Tidak Boleh Menggunakan `shared_from_this()` dalam Pembina?. 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