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
Lepaskan: 2024-12-05 08:52:10
asal
288 orang telah melayarinya

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

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

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

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

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!

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