Pointer to function, pointer to function member of class.
Pointer to function, pointer to function member of class.
#Cara 1 : Secara tradisional
Function pointer (pointer ke fungsi/penunjuk ke fungsi), dapat didefinisikan sebagai berikut:
(typeReturn*) functPointer(typeArgument,typeArgument2,..,typeArgumentN)
sebagai contoh, terdapat 2 fungsi dibawah ini:
[sourcecode language=“cpp”] void Function1() { cout«" call Function1 Function1"«endl; } int Function2(int a,int b) { return (a*b); }
[/sourcecode]
Contoh pemakaian function pointer dari 2 fungsi diatas, sebagai berikut:
[sourcecode language=“cpp”] void (*pf)(); // deklarasi pf=Function1; // assignment pf(); // pemanggilan
int (*pf2)(int,int); // deklarasi
pf2=Function2; // assignment
int c=pf2(5,2); // pemanggilan
[/sourcecode]
Lalu bagaimana kalau kita mau membuat function pointer yang menunjuk ke fungsi yang merupakan anggota dari sebuah class? . Deklarasi dan pemanggilannya agak berbeda, seperti contoh kelas Test dibawah ini:
[sourcecode language=“cpp”] class Test { private: void (Test::*pf1)(); // deklarasi int (Test::pf2)(int,int); // deklarasi public: Test() { pf1=&Test::Function1; //assignment pf2=&Test::Function2; //assignment }; ~Test(){}; void Function1() { cout«" call Function1 Function1 “«endl; }; int Function2(int a,int b) { cout«” call Function2 Function2 “«endl; return (ab); }; void Function3() { (this->*pf1)(); //pemanggilan int c=(this->*pf2)(2,9); //pemanggilan cout«” c value: “«c«endl; }; };
[/sourcecode]
Dengan sedikit memodifikasi function pointer di kelas Test diatas , kita bisa memakai array of function pointer to member class . Misal kita akan mengubah pf1 sebagai array dari function pointer. Deklarasi, assignment, pemanggilan:
[sourcecode language=“cpp”] void (Test::*pf1)10; // deklarasi, jumlah element array=10
pf1[0]=&Test::Function10; //assignment
pf1[1]=&Test::Function11; //assignment
….
….
pf1[9]=&Test::Function12; //assignment
...
...
(this->*pf1)[index](); //pemanggilan , index= index yang di panggil
[/sourcecode]
Dalam penggunaannya, array dari function pointer mungkin lebih sering digunakan.
#Cara 2 : Menggunakan Boost Library ( boost::function ) Pointer ke free function :
[sourcecode language=“cpp”] boost::function<void ()>funcp0; / akan menunjuk ke: void Function1() funcp0=&PrintFunction; funcp0();
boost::function<int (int,int)>funcp1; // akan menunjuk ke: int Function2(int a,int b)
funcp1=&Function2;
int h=funcp1(12,6); //maka h=72.
[/sourcecode]
Untuk mengetahui function pointer yang menunjuk ke fungsi yang merupakan anggota dari sebuah class, function pointer di kelas Test diatas saya ubah sebagai berikut:
[sourcecode language=“cpp”] class Test2 { private: boost::function<void (Test2&)>pf1; boost::function<int (Test2&,int,int)>pf2; public: Test2() { pf1=&Test2::Function1; //assignment pf2=&Test2::Function2; //assignment }; ~Test2(){}; void Function1() { cout«” call Function1 Function1 “«endl; }; int Function2(int a,int b) { cout«” call Function2 Function2 “«endl; return (a*b); }; void Function3() { pf1(*this); // pemanggilan int c=pf2(*this,2,9); // pemanggilan cout«” c value: “«c«endl; }; }; [/sourcecode]
Dapat dilihat di kelas test diatas, yang berubah adalah deklarasi dan pemanggilan. Why boost? .it’s great. < mbebek :D >