Rumah pembangunan bahagian belakang C++ 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?

Aug 22, 2023 pm 04:43 PM
sintaks c++ fungsi bukan ahli penunjuk fungsi ahli

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

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

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Ralat sintaks C++: Tandatangan pembina yang sama muncul beberapa kali, bagaimana untuk menyelesaikannya? Ralat sintaks C++: Tandatangan pembina yang sama muncul beberapa kali, bagaimana untuk menyelesaikannya? Aug 22, 2023 pm 04:49 PM

C++ ialah bahasa pengaturcaraan yang berkuasa, tetapi tidak dapat dielakkan untuk menghadapi pelbagai masalah semasa penggunaan. Antaranya, tandatangan pembina yang sama muncul beberapa kali ialah ralat sintaks yang biasa. Artikel ini menerangkan punca dan penyelesaian kepada ralat ini. 1. Punca ralat Dalam C++, pembina digunakan untuk memulakan ahli data objek apabila mencipta objek. Walau bagaimanapun, jika tandatangan pembina yang sama ditakrifkan dalam kelas yang sama (iaitu, jenis dan susunan parameter adalah sama), pengkompil tidak dapat menentukan pembina yang hendak dipanggil, menyebabkan ralat kompilasi. Sebagai contoh,

Penggunaan pernyataan bersyarat dan contoh dalam C++ Penggunaan pernyataan bersyarat dan contoh dalam C++ Aug 22, 2023 am 08:25 AM

Sebagai bahasa pengaturcaraan peringkat tinggi, C++ mempunyai pelbagai pernyataan kawalan aliran untuk melaksanakan struktur membuat keputusan dan struktur gelung program. Antaranya, pernyataan bersyarat adalah salah satu pernyataan yang paling biasa digunakan dalam pengaturcaraan C++ Ia menentukan laluan pelaksanaan program dengan menilai sama ada syarat itu dipenuhi. Artikel ini akan memperkenalkan penggunaan dan contoh pernyataan bersyarat dalam C++ secara terperinci untuk membantu pembaca memahami dan menggunakan sintaks ini dengan lebih baik. 1. Sintaks asas pernyataan bersyarat Pernyataan bersyarat dalam C++ terutamanya merangkumi tiga jenis: pernyataan if, pernyataan ifelse dan pernyataan suis. bahasa asas mereka

Ralat sintaks C++: fungsi tidak boleh dimasukkan dalam definisi kelas, bagaimana untuk menanganinya? Ralat sintaks C++: fungsi tidak boleh dimasukkan dalam definisi kelas, bagaimana untuk menanganinya? Aug 21, 2023 pm 10:16 PM

C++ ialah bahasa pengaturcaraan berorientasikan objek, dan takrifan kelas ialah salah satu konsep terasnya. Apabila menulis kelas, kita sering menghadapi beberapa ralat sintaks, termasuk ralat yang fungsinya tidak boleh disertakan dalam definisi kelas. Jadi bagaimana kita menangani ralat sintaks ini? Analisis Sebab Dalam bahasa C++, definisi kelas hanya boleh mengandungi pembolehubah ahli dan fungsi ahli, dan fungsi tidak boleh ditakrifkan secara langsung dalam definisi kelas. Ini kerana fungsi yang ditakrifkan dalam definisi kelas adalah fungsi ahli dan mesti dipanggil melalui contoh kelas. Untuk fungsi yang ditakrifkan dalam definisi kelas, adalah mustahil untuk menentukan contoh yang dimiliki oleh fungsi tersebut.

Ralat sintaks C++: fungsi tidak mempunyai nilai pulangan, bagaimana saya harus mengubah suainya? Ralat sintaks C++: fungsi tidak mempunyai nilai pulangan, bagaimana saya harus mengubah suainya? Aug 22, 2023 pm 04:23 PM

Hari ini, kita akan melihat masalah biasa dalam pengaturcaraan C++ - ralat sintaks yang disebabkan oleh fungsi yang tidak mengembalikan nilai, dan cara mengubah suainya. Dalam pengaturcaraan C++, kita sering perlu mentakrifkan fungsi dan memanggilnya di lokasi yang berbeza dalam program Pada masa ini, kita perlu memberi perhatian kepada nilai pulangan fungsi tersebut. Jika fungsi ditakrifkan mempunyai nilai pulangan, maka nilai yang sepadan mesti dikembalikan selepas fungsi itu dilaksanakan. Jika tidak, pengkompil akan mengeluarkan ralat mengatakan "Fungsi tidak mempunyai nilai pulangan". Seterusnya, mari kita lihat contoh mudah: #inclu

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? Aug 22, 2023 pm 04:43 PM

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, anda perlu memahami mengapa penunjuk fungsi ahli tidak boleh menunjuk kepada fungsi bukan ahli. Ini kerana jenis fungsi bukan ahli adalah berbeza daripada jenis fungsi ahli Fungsi ahli perlu secara tersirat melepasi penunjuk ini supaya

Ralat sintaks C++: badan gelung sementara tiada pendakap kerinting, bagaimana untuk menanganinya? Ralat sintaks C++: badan gelung sementara tiada pendakap kerinting, bagaimana untuk menanganinya? Aug 22, 2023 am 09:06 AM

C++ ialah bahasa pengaturcaraan yang cekap, tetapi ralat sintaks tidak dapat dielakkan semasa menulis kod. Satu kesilapan biasa ialah tiada pendakap kerinting dalam badan gelung sementara. Artikel ini menerangkan punca ralat ini dan cara menanganinya. 1. Sebab Dalam C++, pernyataan while digunakan untuk melaksanakan sekeping kod dalam gelung apabila syarat tertentu dipenuhi. Sintaks yang betul ialah: while(condition){//codeblock} dengan syarat ialah ungkapan Boolean, if

Ralat sintaks C++: fungsi bukan ahli tidak boleh mempunyai penunjuk ini, bagaimana untuk menanganinya? Ralat sintaks C++: fungsi bukan ahli tidak boleh mempunyai penunjuk ini, bagaimana untuk menanganinya? Aug 22, 2023 am 08:38 AM

Dalam pengaturcaraan C++, penunjuk "ini" adalah konsep yang sangat penting. Ia mewakili alamat objek semasa dan membenarkan fungsi ahli bukan statik untuk mengakses pembolehubah ahli dan fungsi ahli objek semasa. Walau bagaimanapun, dalam pengaturcaraan C++, anda mungkin menghadapi ralat: fungsi bukan ahli tidak boleh mempunyai penunjuk ini. Ralat ini adalah kerana menggunakan penunjuk ini dalam fungsi bukan ahli pada asasnya bermaksud untuk mengakses pembolehubah ahli atau fungsi ahli objek semasa, tetapi fungsi bukan ahli tidak mempunyai contoh objek, jadi ralat sintaks akan berlaku. Jadi, bagaimana untuk menangani perkara ini

Taipkan teknologi inferens dalam C++ Taipkan teknologi inferens dalam C++ Aug 22, 2023 am 08:07 AM

C++ ialah bahasa yang ditaip kuat Apabila menulis kod C++, kita perlu menentukan jenis pembolehubah dengan tepat, jika tidak, pengkompil mungkin tidak dapat melakukan analisis sintaks dan semakan jenis. Walau bagaimanapun, apabila jenis pembolehubah adalah rumit atau tidak jelas, menentukan jenis secara manual boleh memakan masa dan susah payah. Dalam kes ini, menggunakan teknologi inferens jenis boleh memudahkan penulisan kod kami. Jenis inferens ialah teknik yang membolehkan pengkompil menyimpulkan secara automatik jenis pembolehubah. Tiada mekanisme inferens jenis terbina dalam dalam standard C++98, tetapi dalam C++1

See all articles