Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Lulus Fungsi Ahli Kelas C sebagai Panggilan Balik?
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!