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 :D  >

Advertisement