Meluluskan Ahli Kelas Berfungsi sebagai Panggilan Balik
Apabila menggunakan API yang memerlukan penuding fungsi sebagai panggilan balik, kesukaran mungkin timbul apabila cuba lulus fungsi ahli kelas dari dalam kelas itu sendiri. Artikel ini meneroka selok-belok isu ini dan menawarkan penyelesaian untuk mengatasinya dengan berkesan.
Pernyataan Masalah
Pertimbangkan kelas hipotesis, CLoggersInfra, yang mengandungi fungsi ahli, RedundancyManagerCallBack . Anda berusaha untuk menggunakan fungsi ahli ini sebagai panggilan balik dalam fungsi API Init yang lain, tetapi anda menghadapi ralat kompilasi berikut:
Error 8 error C3867: 'CLoggersInfra::RedundancyManagerCallBack': function call missing argument list; use '&CLoggersInfra::RedundancyManagerCallBack' to create a pointer to member
Menyelidiki Isu
ralat berpunca daripada ciri asas fungsi ahli dalam C . Walaupun mereka nampaknya tergolong secara eksklusif untuk contoh kelas tertentu, mereka secara semula jadi menerima parameter tersembunyi tambahan, yang merupakan rujukan kepada tika kelas itu sendiri. Ini biasanya dirujuk sebagai penunjuk "ini".
Penyelesaian Diterangkan
1. Menggunakan Boost
Boost, pustaka pihak ketiga, menyediakan alat yang berkuasa untuk menyelesaikan isu ini: boost::bind. Ia membolehkan anda mencipta fungsi baharu yang "mengunci" parameter tertentu. Dalam kes ini, parameter "ini" tersembunyi boleh dikunci pada contoh kelas tertentu, dengan berkesan mencipta fungsi baharu dengan hanya satu parameter yang boleh dilihat.
2. Membungkus dengan Objek Tersuai
Sebagai alternatif, anda boleh mencipta objek tersuai yang menerima rujukan kepada contoh kelas dan menyediakan kaedah "jalankan" atau "laksana" yang memanggil fungsi ahli dengan parameter yang dibekalkan . Walau bagaimanapun, pendekatan ini memerlukan pengubahsuaian API untuk menerima objek tersuai anda dan bukannya penunjuk fungsi mentah.
3. Fungsi Lambda C 11
Dalam C 11 dan lebih baru, fungsi lambda menawarkan penyelesaian yang lebih elegan. Mereka boleh menangkap penunjuk "ini", menghapuskan keperluan untuk objek tersuai yang berasingan. Fungsi Lambda menyediakan cara yang ringkas dan mudah untuk mencapai kefungsian yang diingini.
Kesimpulan
Memahami sifat semula jadi fungsi ahli dan parameter "ini" tersembunyinya adalah penting untuk berjaya menghantarnya sebagai panggilan balik. Dengan memanfaatkan keupayaan boost::bind atau C 11 fungsi lambda, anda boleh menyelesaikan ralat kompilasi dengan berkesan dan menggunakan fungsi ahli kelas sebagai fungsi panggil balik dengan lancar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Lulus Fungsi Ahli Kelas C sebagai Panggilan Balik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!