Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi Ahli Kelas C Digunakan sebagai Panggilan Balik C?

Bolehkah Fungsi Ahli Kelas C Digunakan sebagai Panggilan Balik C?

Barbara Streisand
Barbara Streisandasal
2024-12-15 07:36:14553semak imbas

Can C   Class Member Functions Be Used as C Callbacks?

Menggunakan Fungsi Ahli Kelas C sebagai Fungsi Panggilan Balik C

Masalah:

Bila cuba mendaftarkan fungsi ahli kelas C sebagai fungsi panggil balik untuk perpustakaan C, pengkompil melemparkan ralat yang menunjukkan bahawa jenis fungsi tidak sepadan dengan tandatangan yang dijangkakan.

Soalan:

  1. Adakah mungkin untuk mendaftarkan fungsi ahli kelas C sebagai fungsi panggil balik?
  2. Adakah terdapat pendekatan alternatif untuk menyelesaikan masalah ini isu?

Jawapan:

1. Menggunakan Fungsi Ahli Statik:

Ya, adalah mungkin untuk mendaftarkan fungsi ahli kelas C sebagai fungsi panggil balik, tetapi ia mestilah fungsi ahli statik. Fungsi ahli statik tidak mempunyai parameter pertama tersirat dari kelas jenis A*, jadi tandatangan mereka sepadan dengan tandatangan panggil balik yang dijangkakan. Contohnya:

class A {
public:
    static int e(int *k, int *j) {
        return 0;
    }
};

int main() {
    register_with_library(A::e);
    return 0;
}

2. Pendekatan Alternatif:

Sebagai alternatif, anda boleh menggunakan salah satu daripada pendekatan berikut:

  • Buat Fungsi Percuma: Cipta fungsi percuma dengan yang sesuai tandatangan dan panggil fungsi ahli kelas C dari dalamnya. Contohnya:
void e_wrapper(int *k, int *j) {
    A().e(k, j);
}
  • Gunakan Penunjuk Fungsi: Takrifkan penunjuk fungsi dan tetapkan alamat fungsi ahli kelas C kepadanya. Contohnya:
int (*ptr)(int *, int *) = &A::e;
register_with_library(ptr);

Atas ialah kandungan terperinci Bolehkah Fungsi Ahli Kelas C Digunakan 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