Search code examples
c++pointer-to-memberthis-pointer

Assigning C++ function pointers to member functions of the same object


How do I get the function pointer assignments (and maybe the rest) in test.calculate to work?

#include <iostream>

class test {

    int a;
    int b;

    int add (){
        return a + b;
    }

    int multiply (){
        return a*b;
    }

    public:
    int calculate (char operatr, int operand1, int operand2){
        int (*opPtr)() = NULL;

        a = operand1;
        b = operand2;

        if (operatr == '+')
            opPtr = this.*add;
        if (operatr == '*')
            opPtr = this.*multiply;

        return opPtr();
    }
};

int main(){
    test t;
    std::cout << t.calculate ('+', 2, 3);
}

Solution

  • There are several problems with your code.

    First, int (*opPtr)() = NULL; isn't a pointer to a member function, its a pointer to a free function. Declare a member function pointer like this:

    int (test::*opPtr)() = NULL;

    Second, you need to specify class scope when taking the address of a member function, like this:

    if (operatr == '+') opPtr = &test::add;
    if (operatr == '*') opPtr = &test::multiply;
    

    Finally, to call through a member function pointer, there is special syntax:

    return (this->*opPtr)();
    

    Here is a complete working example:

    #include <iostream>
    
    class test {
    
        int a;
        int b;
    
        int add (){
            return a + b;
        }
    
        int multiply (){
            return a*b;
        }
    
        public:
        int calculate (char operatr, int operand1, int operand2){
            int (test::*opPtr)() = NULL;
    
            a = operand1;
            b = operand2;
    
            if (operatr == '+') opPtr = &test::add;
            if (operatr == '*') opPtr = &test::multiply;
    
            return (this->*opPtr)();
        }
    };
    
    int main(){
        test t;
        std::cout << t.calculate ('+', 2, 3);
    }