Pointer declaration for member function:
Method 1: When Class is not declared as pointer
M n;
void(M::*pf)(int,int)=&M::setxy; (n.*pf)(10,20);
n.setxy(10,20); //is same as prior statement.
Remember in C the syntax is (*function_name)(arguments); in C++ the only difference is the function should be member function of a class therefore the function should be identified by the class with help of scope operator ::, thus the syntax for C++ is (class_name::*function_name)(argument);
Method 2: When Class is declared as pointer
M *op;
op=&n;
(op->*pf)(30,40);
The difference from the first method is the class is also declared as pointer class, in such case the dereferencing operator -> is used (pointer_class_name:_*pointer_function_name)(argument);
The following example will give clear understanding of pointer to members both function members and data member.
class M
{int x, y;
public:
void setxy(int a, int b)
{x=a;
y=b;
}
friend int sum(M m);
};
int sum(M m)
{//Declaring pointer to data member int M::*px;
px=&M::x; int M::*py; py=&M::y;
//Declaring class as pointer
M *pm;
pm=&m;
int S,S1,S2;
//Two ways of reading through pointer
S1=m.*px; //object_name.*pointer-to-member function
S2=pm->*py;//pointer-to-object->*pointer-to-member function
S=S1+S2;
//S=m.x+m.y; //is same as prior statement without pointer.
return S;
}
int main()
{clrscr();
M n; void(M::*pf)(int,int)=&M::setxy; (n.*pf)(10,20);
n.setxy(10,20); //is same as prior statement. cout<<"SUM is "<<sum(n)<<"\n";
M *op;
op=&n;
(op->*pf)(30,40);
//n.setxy(30,40); //is same as prior statement. cout<<"Sum is "<<sum(n);
return 0;
}