Meluluskan Ahli Kelas Berfungsi sebagai Panggilan Balik
Dalam pengaturcaraan berorientasikan objek, kadangkala perlu menghantar fungsi ahli kelas sebagai panggilan balik kepada API luaran. Walau bagaimanapun, mencuba ini secara terus-terang mungkin menghadapi ralat penyusunan, seperti yang ditunjukkan dalam senario berikut:
m_cRedundencyManager->Init(this->RedundancyManagerCallBack);
Pengkompil mengadu tentang senarai argumen yang hilang untuk penuding fungsi, sebaliknya mencadangkan penggunaan &CLoggersInfra::RedundancyManagerCallBack. Walau bagaimanapun, ini masih gagal untuk disusun.
Memahami Fungsi Ahli
Sebelum mendalami penyelesaian, adalah penting untuk memahami sifat sebenar fungsi ahli. Dalam C , fungsi ahli pada dasarnya adalah fungsi biasa yang mempunyai parameter tersembunyi tambahan: ini. Parameter tersembunyi ini mewakili contoh objek yang dimiliki oleh fungsi itu.
Pertimbangkan contoh berikut:
class A { public: int data; void foo(int addToData) { data += addToData; } };
Fungsi A::foo mengambil satu parameter, tetapi secara dalaman, ia beroperasi dengan dua parameter : addToData dan ini. Yang terakhir menunjuk ke objek A yang mana foo dipanggil. Tingkah laku ini tersirat apabila menggunakan sintaks fungsi ahli an_a_object.foo(5). Secara sintaksis, pengkompil menterjemah ini kepada A::foo(&an_a_object, 5).
Masalah dengan Panggilan Balik
Berbalik kepada masalah asal, fungsi Init API menjangkakan penunjuk fungsi yang mengambil satu parameter. Walau bagaimanapun, fungsi ahli kelas seperti CLoggersInfra::RedundancyManagerCallBack sememangnya memerlukan dua parameter, termasuk parameter tersembunyi ini. Ketidakserasian ini membawa kepada ralat penyusunan.
Penyelesaian: Mengikat dengan Fungsi Boost atau Lambda
Penyelesaian konvensional melibatkan pengikatan fungsi ahli kepada contoh kelas tertentu menggunakan rangsangan Boost ::bind library atau fungsi lambda C 11.
Dengan boost::bind, seseorang boleh mencipta fungsi baharu yang mengambil parameter yang diperlukan dengan "mengunci" parameter ini tersembunyi ke contoh objek tertentu. Fungsi baharu ini kemudiannya boleh dihantar sebagai panggilan balik.
#include <boost/bind.hpp> auto bound_callback = boost::bind(&CLoggersInfra::RedundencyManagerCallBack, this); Init(boost::function<void()>(bound_callback));
C 11 menawarkan fungsi lambda sebagai alternatif yang lebih mudah untuk meningkatkan::bind. Fungsi Lambda juga boleh menangkap penunjuk ini, membolehkan pengikatan panggilan balik ringkas:
auto lambda_callback = [this]() { RedundancyManagerCallBack(); }; Init(std::function<void()>(lambda_callback));
Atas ialah kandungan terperinci Bagaimana untuk Lulus Fungsi Ahli Kelas C sebagai Panggilan Balik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!