Dalam pengaturcaraan berorientasikan objek, selalunya perlu untuk menghantar fungsi ahli sebagai hujah kepada fungsi lain. Walau bagaimanapun, melakukan ini dengan betul boleh menjadi agak rumit, terutamanya apabila menggunakan penuding ini.
Mari kita pertimbangkan contoh khusus daripada coretan kod yang disediakan:
class testMenu : public MenuScreen { // ... void test2() { draw = true; } }; MenuButton<testMenu> x; testMenu() : MenuScreen("testMenu") { x.SetButton(100, 100, ..., &test2); }
Di sini, fungsi ahli test2 diberikan kepada ahli ButtonFunc MenuButton menggunakan fungsi SetButton:
template <class object> void MenuButton::SetButton(..., void (object::*ButtonFunc)()) { this->ButtonFunc = &ButtonFunc; }
The masalah timbul apabila memanggil fungsi test2 dari kelas MenuButton. Untuk melakukan ini, kita memerlukan kedua-dua penunjuk kepada objek (iaitu, testMenu) dan penunjuk kepada fungsi (iaitu, &test2). Dalam versi SetButton yang diubah suai:
template <class object> void MenuButton::SetButton(..., object *ButtonObj, void (object::*ButtonFunc)()) { this->ButtonObj = ButtonObj; this->ButtonFunc = ButtonFunc; }
Kami menghantar rujukan kepada objek, yang boleh diakses menggunakan penunjuk ButtonObj. Penunjuk fungsi ahli kemudiannya dipanggil menggunakan ((ButtonObj)->*(ButtonFunc))().
Akhir sekali, pembina testMenu yang diperbetulkan:
testMenu() : MenuScreen("testMenu") { x.SetButton(100, 100, ..., this, &test2); }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melepasi Penunjuk Fungsi Ahli dalam C dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!