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:
void Function1()
{
cout<<" call Function1 Function1"<<endl;
}
int Function2(int a,int b)
{
return (a*b);
}
Contoh pemakaian function pointer dari 2 fungsi diatas, sebagai berikut:
void (*pf)(); // deklarasi pf=Function1; // assignment pf(); // pemanggilan int (*pf2)(int,int); // deklarasi pf2=Function2; // assignment int c=pf2(5,2); // pemanggilan
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:
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 (a*b);
};
void Function3()
{
(this->*pf1)(); //pemanggilan
int c=(this->*pf2)(2,9); //pemanggilan
cout<<" c value: "<<c<<endl;
};
};
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:
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
Dalam penggunaannya, array dari function pointer mungkin lebih sering digunakan.
#Cara 2 : Menggunakan Boost Library ( boost::function )
Pointer ke free function :
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.
Untuk mengetahui function pointer yang menunjuk ke fungsi yang merupakan anggota dari sebuah class, function pointer di kelas Test diatas saya ubah sebagai berikut:
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;
};
};
Dapat dilihat di kelas test diatas, yang berubah adalah deklarasi dan pemanggilan. Why boost? .it’s great. < mbebek
>