Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli, bagaimana untuk menanganinya?

Ralat sintaks C++: penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli, bagaimana untuk menanganinya?

王林
王林asal
2023-08-22 16:43:471435semak imbas

Ralat sintaks C++: penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli, bagaimana untuk menanganinya?

Dalam pengaturcaraan C++, penunjuk fungsi ahli ialah penunjuk kepada fungsi ahli kelas. Menggunakan penunjuk fungsi ahli membolehkan anda memilih fungsi ahli secara dinamik untuk dipanggil pada masa berjalan, yang merupakan teknik yang sangat berguna. Walau bagaimanapun, kadangkala kita menghadapi masalah, iaitu penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli Bagaimana kita harus menangani perkara ini?

Pertama sekali, anda perlu memahami mengapa penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli. Ini kerana jenis fungsi bukan ahli adalah berbeza daripada fungsi ahli. Fungsi ahli perlu melepasi penunjuk ini secara tersirat untuk mengakses pembolehubah ahli dan fungsi kelas. Oleh itu, penuding fungsi ahli menyimpan alamat fungsi ahli dan penuding kelas, manakala fungsi bukan ahli tidak mempunyai penuding ini dan tidak boleh mengakses pembolehubah ahli dan fungsi kelas, jadi penuding fungsi ahli tidak boleh menunjuk ke fungsi bukan ahli.

Kita boleh menyelesaikan masalah ini dengan beberapa helah. Berikut ialah beberapa penyelesaian:

  1. Gunakan functors atau ungkapan lambda

Functor ialah kelas yang melaksanakan operator panggilan fungsi. Kita boleh membebankan operator panggilan fungsi supaya objek kelas boleh dipanggil seperti fungsi. Oleh itu, kita boleh menggunakan functor untuk melaksanakan fungsi fungsi ahli, supaya penunjuk fungsi ahli boleh menunjuk ke objek functor. Ekspresi Lambda juga boleh mencapai fungsi yang sama.

Berikut ialah contoh penggunaan functor:

#include <iostream>

class MyClass {
public:
    void foo() {
        std::cout << "Hello from foo!";
    }
};

class FunctionObject {
public:
    void operator()() {
        obj.foo();
    }
    MyClass obj;
};

int main() {
    FunctionObject f;
    f();
    return 0;
}

Dalam kod di atas, kami mentakrifkan kelas FunctionObject, yang mengandungi objek MyClass dan fungsi operator() Apabila objek functor dipanggil, ia akan dipanggil operator () fungsi, dengan itu memanggil fungsi foo MyClass.

Kita boleh memanggil fungsi foo dengan menghantar alamat objek FunctionObject kepada penuding fungsi ahli. Contohnya:

void (MyClass::*func_ptr)() = &MyClass::foo;
FunctionObject f;
MyClass* p = &(f.obj);
(p->*func_ptr)();

Dalam kod di atas, kami mentakrifkan penunjuk fungsi ahli func_ptr, menunjuk ke fungsi foo MyClass. Kemudian, kami mencipta objek FunctionObject f dan memberikan alamat ahli objnya kepada penuding MyClass p. Akhir sekali, kami menggunakan operator akses ahli (p->*) dan penunjuk fungsi ahli func_ptr untuk memanggil fungsi foo.

  1. Gunakan fungsi global dan penunjuk void*

Penyelesaian lain ialah menggunakan fungsi global dan penunjuk void*. Kita boleh mentakrifkan fungsi global yang menerima penunjuk void sebagai parameter dan menukarkannya kepada penunjuk kepada kelas dan memanggil fungsi ahli. Kemudian, kita boleh menetapkan alamat fungsi global ini kepada penuding fungsi ahli untuk memanggil fungsi ahli kelas.

Berikut ialah contoh penggunaan fungsi global dan penuding void*:

#include <iostream>

class MyClass {
public:
    void foo() {
        std::cout << "Hello from foo!";
    }
};

void invoke_function(void* obj_ptr, void (*func_ptr)()) {
    MyClass* p = static_cast<MyClass*>(obj_ptr);
    (p->*func_ptr)();
}

int main() {
    void (*func_ptr)() = &MyClass::foo;
    MyClass obj;
    invoke_function(&obj, func_ptr);
    return 0;
}

Dalam kod di atas, kami mentakrifkan fungsi invoke_function global, yang menerima penunjuk void

dan penuding fungsi sebagai parameter. Dalam fungsi invoke_function, kami menukar void pointer obj_ptr kepada MyClass pointer p, dan menggunakan operator akses ahli (p->*) dan fungsi pointer func_ptr untuk memanggil fungsi foo. Dalam fungsi utama, kami mentakrifkan penunjuk fungsi ahli func_ptr, menunjuk kepada fungsi foo MyClass. Kemudian, kami mencipta objek MyClass obj dan menghantar alamatnya kepada fungsi invoke_function, dan kemudian lulus func_ptr ke fungsi invoke_function.

Ringkasan

Penunjuk fungsi ahli ialah alat berkuasa yang membolehkan kami memilih fungsi ahli secara dinamik untuk dipanggil semasa masa jalan. Walau bagaimanapun, apabila menggunakan penunjuk fungsi ahli, jika kita perlu menunjuk kepada fungsi bukan ahli, kita boleh menggunakan functors atau ungkapan Lambda, atau menggunakan fungsi global dan penunjuk void*. Teknik ini boleh membantu kami menyelesaikan masalah bahawa penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli.

Atas ialah kandungan terperinci Ralat sintaks C++: penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli, bagaimana untuk menanganinya?. 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