Rumah > pembangunan bahagian belakang > C++ > Bagaimana Meluluskan Fungsi Ahli Kelas dengan Betul sebagai Panggilan Balik dalam C?

Bagaimana Meluluskan Fungsi Ahli Kelas dengan Betul sebagai Panggilan Balik dalam C?

Linda Hamilton
Lepaskan: 2024-12-16 13:26:21
asal
543 orang telah melayarinya

How to Correctly Pass Class Member Functions as Callbacks in C  ?

Mengatasi Ralat Penyusunan apabila Melepasi Ahli Kelas Berfungsi sebagai Panggilan Balik

Anda menghadapi ralat kompilasi apabila menghantar fungsi ahli kelas sebagai panggilan balik kerana salah faham tentang sintaks dan parameter "ini" tersembunyi dalam ahli fungsi.

Menjelaskan Fungsi Ahli

Fungsi ahli bukan fungsi kendiri tetapi berfungsi dengan penuding tambahan "ini" tersembunyi. Penunjuk ini merujuk contoh kelas yang dimiliki oleh fungsi tersebut. Apabila memanggil fungsi ahli menggunakan sintaks contoh kelas (cth., object.memberFunction()), pengkompil secara automatik menentukan nilai "ini."

Teka-teki sintaks

Pendekatan awal anda gagal kerana anda cuba lulus &CLoggersInfra::RedundencyManagerCallBack sebagai panggil balik. Penunjuk fungsi ini tidak mempunyai penunjuk "ini" yang diperlukan. Sintaks yang betul ialah:

m_cRedundencyManager->Init(std::bind(&CLoggersInfra::RedundencyManagerCallBack, this));
Salin selepas log masuk

Menyingkap "ini" Tersembunyi

Anda mahu menghantar panggilan balik yang khusus kepada contoh tertentu kelas CLoggersInfra. Untuk mengambil kira penunjuk "ini" yang tersembunyi, anda perlu mengikatnya secara eksplisit.

std::bind1st dan boost::bind Rescue

Gunakan std::bind1st atau boost::bind untuk mengikat penunjuk "ini", mencipta fungsi baharu yang mengambil contoh sebagai parameter tersembunyi dan parameter asal panggil balik seperti biasa. Ini menyelesaikan isu kompilasi.

Tangkapan Tersembunyi

Init memerlukan penunjuk fungsi mentah, yang boost::bind tidak disediakan di luar kotak. Walau bagaimanapun, StackOverflow menawarkan penyelesaian untuk menukar boost::functions kepada penunjuk mentah.

Kemas Kini C 11 dengan Fungsi Lambda

Dalam C 11 dan kemudian, fungsi lambda yang menangkap "ini" boleh menggantikan boost::bind untuk tujuan ini.

Atas ialah kandungan terperinci Bagaimana Meluluskan Fungsi Ahli Kelas dengan Betul sebagai Panggilan Balik 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