Bagaimana untuk Menghantar Antara Kekosongan* Penunjuk dan Penunjuk ke Fungsi Ahli dalam C ?

Patricia Arquette
Lepaskan: 2024-10-27 20:48:30
asal
193 orang telah melayarinya

How to Cast Between a void* Pointer and a Pointer to a Member Function in C  ?

Memutuskan antara kekosongan* dan Penunjuk ke Fungsi Ahli

Apabila bekerja dengan kebolehoperasian C/C, seseorang boleh menghadapi kesukaran apabila cuba menghantar antara penunjuk kosong dan penunjuk kepada fungsi ahli. Isu ini sering timbul apabila berurusan dengan penutupan dalam bahasa seperti Lua, di mana data pengguna disimpan sebagai penunjuk kosong.

Masalah:

Menghantar kekosongan* ke penuding ke fungsi ahli dalam C adalah tidak sah kerana perbezaan asas dalam perwakilan ingatan mereka. Penunjuk kepada ahli mengandungi maklumat tambahan yang tidak boleh diakses melalui penunjuk biasa.

Penyelesaian:

Untuk menyelesaikan masalah ini, pertimbangkan pilihan berikut:

1. Balut Fungsi Ahli dalam Fungsi Percuma:

  • Buat fungsi percuma yang menerima contoh objek sebagai argumen pertama dan parameter fungsi ahli sebagai argumen seterusnya.
  • Kembali alamat fungsi percuma ini dan bukannya penunjuk kepada ahli.

Coretan Kod:

<code class="cpp">int call_int_function(lua_State *L) {
    void (*method)(T*, int, int) = reinterpret_cast<void (*)(T*, int, int)>(lua_touserdata(L, lua_upvalueindex(1)));
    T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1));

    method(obj, lua_tointeger(L, 2), lua_tointeger(L, 3));
    return 0;
}</code>
Salin selepas log masuk

2. Gunakan Objek Fungsi:

  • Gunakan teknik yang serupa dengan mem_fun Boost.Bind untuk mencipta objek fungsi yang membalut fungsi ahli.
  • Templat objek fungsi untuk menyokong berbeza jenis objek.

Pertimbangan Lain:

  • Pastikan kawalan ke atas data pengguna yang dikembalikan oleh lua_touserdata kerana ia tidak boleh mengandungi penunjuk kepada ahli yang sah .
  • Pertimbangkan untuk membungkus fungsi ahli dalam kaedah kelas atau fungsi statik jika anda memerlukan keadaan tambahan.

Atas ialah kandungan terperinci Bagaimana untuk Menghantar Antara Kekosongan* Penunjuk dan Penunjuk ke Fungsi Ahli dalam C ?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!