Although the syntax of pointers to members may seem a bit confusing at first, it is consistent and resembles the form of ordinary pointers, with the addition of the class name followed by the operator :: before the asterisk. For example, if an ordinary pointer to int looks like this:
you define a pointer to an int member of class A like this:
Code:
class A{/**/};
int A::*pmi; // pmi is a pointer to an int member of A
You can initialize a pointer to member:
Code:
class A
{
public:
int num;
int x;
};
int A::*pmi = &A::num; // 1
The statement numbered 1 defines a pointer to an int member of class A and initializes it with the address of the member num. Now you can use the pointer pmi to examine and modify the value of num in any object of class A:
Code:
A a1;
A a2;
int n = a1.*pmi; // copy the value of a1.num to n
a1.*pmi = 5; // assign the value 5 to a1.num
a2.*pmi = 6; // assign the value 6 to a2.num
Similarly, you can access a data member through a pointer to A:
Code:
A * pa = new A;
int n = pa->*pmi; // assign to n the value of pa->num
pa->*pmi = 5; // assign the value 5 to pa->num
Or using a pointer to an object derived from A:
Code:
class D : public A {};
A* pd = new D;
pd->*pmi = 5; // assign a value of 5 to pd->num