Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melepasi Penunjuk Fungsi Ahli dalam C dengan betul?

Bagaimanakah Saya Boleh Melepasi Penunjuk Fungsi Ahli dalam C dengan betul?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 08:52:10301semak imbas

How Can I Correctly Pass Member Function Pointers in C  ?

Melalui Penunjuk Fungsi Ahli dalam C

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!

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