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
542 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!

sumber:php.cn
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