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
Lepaskan: 2024-12-17 22:24:10
asal
613 orang telah melayarinya

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);
Salin selepas log masuk

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; }
};
Salin selepas log masuk

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));
Salin selepas log masuk

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));
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan