Menggunakan Fungsi Ahli Kelas C sebagai Fungsi Panggilan Balik C
Apabila berinteraksi dengan perpustakaan C daripada kod C, ia menjadi perlu untuk mewujudkan panggilan balik . Artikel ini meneroka cabaran yang dihadapi semasa cuba mendaftarkan fungsi ahli kelas C sebagai panggilan balik untuk fungsi C dengan tandatangan tertentu, int a(int , int ).
Halangan utama yang ditemui ialah fungsi ahli bukan statik mempunyai parameter pertama tersirat kelas jenis A*, yang mewakili penunjuk ini. Ketidakpadanan dalam tandatangan parameter antara fungsi panggil balik yang dijangkakan dan fungsi ahli kelas C yang disediakan membawa kepada ralat penyusunan.
Penyelesaian:
Untuk mengatasi isu ini, ahli fungsi mesti diisytiharkan statik. Ini menghapuskan parameter pertama tersirat, membenarkan fungsi ahli kelas C didaftarkan sebagai panggilan balik.
Pendekatan Ganti:
Jika mekanisme pendaftaran panggilan balik membenarkan, alternatif pendekatan adalah untuk mencipta fungsi pembalut. Fungsi pembalut ini boleh menjadi fungsi C biasa yang memajukan argumen kepada fungsi ahli kelas C yang dikehendaki. Dengan mendaftarkan fungsi pembalut sebagai panggil balik, fungsi ahli kelas boleh digunakan secara tidak langsung melalui proksi.
Contoh:
Pertimbangkan kod contoh di bawah:
class A { public: A(); ~A(); int e(int *k, int *j); private: static int e_c(int *k, int *j) { A* this_ptr = reinterpret_cast<A*>(callback_user_data); return this_ptr->e(k, j); } }; A::A() { register_with_library(e_c) }
Dalam kod di atas, fungsi e_c() ialah fungsi pembungkus statik yang menghantar data_pengguna_panggilan balik hujah kepada penuding A*, membenarkan akses kepada penuding ini dan seruan seterusnya bagi fungsi ahli e(). Pendekatan ini membolehkan fungsi ahli kelas C didaftarkan secara tidak langsung sebagai panggilan balik, walaupun ia tidak sepadan dengan tandatangan tepat fungsi panggil balik.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli Kelas C sebagai Panggilan Balik C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!