Fungsi panggilan balik adalah fungsi, yang merupakan argumen, bukan parameter, dalam fungsi lain. Fungsi lain boleh dipanggil fungsi utama. Oleh itu, dua fungsi terlibat: fungsi utama dan fungsi panggilan balik itu sendiri. Dalam senarai parameter fungsi utama, deklarasi fungsi panggilan balik tanpa definisinya ada, sama seperti pernyataan objek tanpa penugasan yang ada. Fungsi utama dipanggil dengan argumen (dalam utama ()). Salah satu argumen dalam fungsi panggilan utama adalah definisi berkesan fungsi panggilan balik. Dalam C ++, argumen ini merujuk kepada definisi fungsi panggilan balik; itu bukan definisi sebenarnya. Fungsi panggil balik itu sendiri sebenarnya disebut dalam definisi fungsi utama.
Fungsi panggilan balik asas dalam C ++ tidak menjamin tingkah laku tidak segerak dalam program. Tingkah laku tak segerak adalah faedah sebenar skema fungsi panggilan balik. Dalam skema fungsi panggilan balik tak segerak, hasil fungsi utama harus diperoleh untuk program sebelum hasil fungsi panggilan balik diperoleh. Ada kemungkinan untuk melakukan ini di C ++; namun, C ++ mempunyai perpustakaan yang disebut masa depan untuk menjamin tingkah laku skema fungsi panggilan balik tak segerak.
Artikel ini menerangkan skema fungsi panggilan balik asas. Sebilangan besar dengan C tulen++. Mengenai panggilan balik, tingkah laku asas perpustakaan masa depan juga dijelaskan. Pengetahuan asas mengenai C ++ dan petunjuknya diperlukan untuk pemahaman artikel ini.
Kandungan Artikel
- Skim Fungsi Panggilan Balik Asas
- Tingkah laku segerak dengan Fungsi Panggilan Balik
- Tingkah Laku tak segerak dengan Fungsi Panggilan Balik
- Penggunaan asas Perpustakaan masa depan
- Kesimpulannya
Skim Fungsi Panggilan Balik Asas
Skema fungsi panggilan balik memerlukan fungsi utama, dan fungsi panggilan balik itu sendiri. Pengisytiharan fungsi panggilan balik adalah sebahagian daripada senarai parameter fungsi utama. Definisi fungsi panggilan balik ditunjukkan dalam fungsi panggilan fungsi utama. Fungsi panggil balik sebenarnya dipanggil dalam definisi fungsi utama. Program berikut menggambarkan ini:
#sertakanmenggunakan ruang nama std;
int PrincipalFn (char ch [], int (* ptr) (int))
int id1 = 1;
int id2 = 2;
int idr = (* ptr) (id2);
cout<<"principal function: "<
int cb (int iden)
cout<<"callback function"<<'\n';
mengembalikan iden;
int utama ()
int (* ptr) (int) = &cb;
char cha [] = "dan";
prinsipalFn (cha, cb);
pulangan 0;
Keluarannya adalah:
fungsi panggilan balikfungsi utama: 1 dan 2
Fungsi utama dikenal pasti oleh principalFn (). Fungsi panggil balik dikenal pasti oleh cb (). Fungsi panggil balik didefinisikan di luar fungsi utama tetapi sebenarnya dipanggil dalam fungsi utama.
Perhatikan deklarasi fungsi panggilan balik sebagai parameter dalam senarai parameter deklarasi fungsi utama. Pengisytiharan fungsi panggilan balik adalah "int (* ptr) (int)". Perhatikan ungkapan fungsi panggilan balik, seperti fungsi panggilan, dalam definisi fungsi utama; sebarang hujah untuk panggilan fungsi panggilan balik disampaikan di sana. Pernyataan untuk panggilan fungsi ini adalah:
int idr = (* ptr) (id2);Di mana id2 adalah hujah. ptr adalah bagian dari parameter, penunjuk, yang akan dihubungkan dengan rujukan fungsi panggilan balik dalam fungsi utama ().
Perhatikan ungkapan:
int (* ptr) (int) = &cb;Dalam fungsi utama (), yang menghubungkan pengisytiharan (tanpa definisi) fungsi panggilan balik ke nama definisi fungsi panggilan balik yang sama.
Fungsi utama dipanggil, dalam fungsi utama (), sebagai:
prinsipalFn (cha, cb);Di mana cha adalah rentetan dan cb adalah nama fungsi panggilan balik tanpa ada argumennya.
Tingkah Laku Fungsi Panggilan Balik
Pertimbangkan program berikut:
#sertakanmenggunakan ruang nama std;
void prinsipal Fn (void (* ptr) ())
cout<<"principal function"<<'\n';
(* ptr) ();
batal cb ()
cout<<"callback function"<<'\n';
batal fn ()
cout<<"seen"<<'\n';
int utama ()
tidak sah (* ptr) () = &cb;
prinsipalFn (cb);
fn ();
pulangan 0;
Keluarannya adalah:
fungsi utamafungsi panggilan balik
dilihat
Terdapat fungsi baru di sini. Semua fungsi baru yang dilakukan adalah untuk menampilkan output, "dilihat". Dalam fungsi utama (), fungsi utama dipanggil, kemudian fungsi baru, fn () dipanggil. Output menunjukkan bahawa kod untuk fungsi utama dieksekusi, kemudian untuk fungsi panggil balik dijalankan, dan akhirnya untuk fungsi fn () dijalankan. Ini adalah tingkah laku segerak (utas tunggal).
Sekiranya itu adalah tingkah laku asinkron, apabila tiga segmen kod dipanggil dalam urutan, segmen kod pertama dapat dijalankan, diikuti oleh pelaksanaan segmen kod ketiga, sebelum segmen kod kedua dijalankan.
Nah, fungsi, fn () dapat dipanggil dari dalam definisi fungsi utama, bukan dari dalam fungsi utama (), seperti berikut:
#sertakanmenggunakan ruang nama std;
batal fn ()
cout<<"seen"<<'\n';
void prinsipal Fn (void (* ptr) ())
cout<<"principal function"<<'\n';
fn ();
(* ptr) ();
batal cb ()
cout<<"callback function"<<'\n';
int utama ()
tidak sah (* ptr) () = &cb;
prinsipalFn (cb);
pulangan 0;
Keluarannya adalah:
fungsi utamadilihat
fungsi panggilan balik
Ini adalah tiruan daripada tingkah laku tidak segerak. Ia bukan tingkah laku tidak segerak. Itu masih tingkah laku segerak.
Juga, urutan pelaksanaan segmen kod fungsi utama dan segmen kod fungsi panggilan balik dapat ditukar dalam definisi fungsi utama. Program berikut menggambarkan ini:
#sertakanmenggunakan ruang nama std;
void prinsipal Fn (void (* ptr) ())
(* ptr) ();
cout<<"principal function"<<'\n';
batal cb ()
cout<<"callback function"<<'\n';
batal fn ()
cout<<"seen"<<'\n';
int utama ()
tidak sah (* ptr) () = &cb;
prinsipalFn (cb);
fn ();
pulangan 0;
Keluarannya sekarang,
fungsi panggilan balikfungsi utama
dilihat
Ini juga merupakan tiruan daripada tingkah laku tak segerak. Ia bukan tingkah laku tidak segerak. Itu masih tingkah laku segerak. Tingkah laku asinkron yang benar dapat diperoleh seperti yang dijelaskan di bahagian seterusnya atau dengan perpustakaan, di masa depan.
Tingkah Laku tak segerak dengan Fungsi Panggilan Balik
Kod pseudo untuk skema fungsi panggilan balik asinkron asas adalah:
keluarkan jenis;taip cb (jenis output)
// pernyataan
taip prinsipal Fn (input type, type cb (type output))
// pernyataan
Perhatikan kedudukan data input dan output di tempat berlainan kod pseudo. Input fungsi panggilan balik adalah outputnya. Parameter fungsi utama adalah parameter input untuk kod umum dan parameter untuk fungsi panggilan balik. Dengan skema ini, fungsi ketiga dapat dijalankan (disebut) dalam fungsi utama () sebelum output fungsi panggilan balik dibaca (masih dalam fungsi utama ()). Kod berikut menggambarkan ini:
#sertakanmenggunakan ruang nama std;
output char *;
batal cb (habiskan [])
output = keluar;
void prinsipal Fn (char char [], void (* ptr) (char [50]))
(* ptr) (input);
cout<<"principal function"<<'\n';
batal fn ()
cout<<"seen"<<'\n';
int utama ()
input char [] = "fungsi panggilan balik";
batal (* ptr) (char []) = &cb;
prinsipalFn (input, cb);
fn ();
cout<