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));
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!