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 “<*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::functionfuncp0; / 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::functionpf1; boost::functionpf2; 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  >

comments powered by Disqus