Search code examples
c++oopfunction-pointerspointer-to-membermember-functions

How can I define a class member as a pointer to another member function?


I'd like to set up a function pointer as a member of a class that is a pointer to another function in the same class. The reasons why I'm doing this are complicated.

In this example, I would like the output to be "1"

class A {
public:
 int f();
 int (*x)();
}

int A::f() {
 return 1;
}


int main() {
 A a;
 a.x = a.f;
 printf("%d\n",a.x())
}

But this fails at compiling. Why?


Solution

  • The syntax is wrong. A member pointer is a different type category from a ordinary pointer. The member pointer will have to be used together with an object of its class:

    class A {
    public:
     int f();
     int (A::*x)(); // <- declare by saying what class it is a pointer to
    };
    
    int A::f() {
     return 1;
    }
    
    
    int main() {
     A a;
     a.x = &A::f; // use the :: syntax
     printf("%d\n",(a.*(a.x))()); // use together with an object of its class
    }
    

    a.x does not yet say on what object the function is to be called on. It just says that you want to use the pointer stored in the object a. Prepending a another time as the left operand to the .* operator will tell the compiler on what object to call the function on.