Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Lulus Fungsi Ahli Kelas C sebagai Panggilan Balik?

Bagaimana untuk Lulus Fungsi Ahli Kelas C sebagai Panggilan Balik?

Linda Hamilton
Linda Hamiltonasal
2024-12-17 22:24:10628semak imbas

How to Pass a C   Class Member Function as a Callback?

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!

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