Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli Kelas C sebagai Panggilan Balik C?

Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli Kelas C sebagai Panggilan Balik C?

Patricia Arquette
Patricia Arquetteasal
2024-12-20 20:36:12773semak imbas

How Can I Use a C   Class Member Function as a C Callback?

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!

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