Search code examples
c++function-pointers

Accessing entry of Array of function pointers, within a class C++


I wrote a simple class that performs basic arithmetic operations using a method that receives an index and two values to compute.

The index indicates which operation to perform in a table that contains pointers to functions.

Here is my code:

#include <iostream>

using namespace std;

class TArith
{
public:

    static const int  DIV_FACTOR = 1000;

    typedef int (TArith::*TArithActionFunc)(int,int);

    struct TAction
    {
        enum Values
        {
            Add,
            Sub,
            count,
        };
    };

    int action(TAction::Values a_actionIdx, int a_A, int  a_B)
    {
        return ( this->*m_actionFcns[a_actionIdx] )(a_A,a_B);
    }

private:
    int add(int a_A, int a_B)
    {
        return a_A + a_B ; 
    }

    int sub(int a_A, int a_B)
    {
        return a_A - a_B ; 
    }

    static TArithActionFunc m_actionFcns[TAction::count];
    int m_a;
    int m_b;
};

TArith:: TArithActionFunc  TArith:: m_actionFcns[TAction::count] = {
    TArith::add,
    TArith::sub
};

void main(void)
{
    TArith arithObj;
    int a=100;
    int b=50;

    for(int i = 0 ; i <TArith::TAction::count ; ++i)
    {    
        cout<<arithObj.action( (TArith::TAction::Values)i,a,b )<<endl;
    }
    cout<<endl;
}

Compiler says:

'TArith::add': function call missing argument list; use '&TArith::add' to create a pointer to member
'TArith::sub': function call missing argument list; use '&TArith::sub' to create a pointer to member

why do I need to use the & symbol?


Solution

  • TArith:: TArithActionFunc  TArith:: m_actionFcns[TAction::count] = {
        TArith::add,
        TArith::sub,
        TArith::mul,
        TArith::div
    };
    

    Correct syntax for a pointer to a member function f of a class C is &C::f. You're missing the leading &.

    Try:

    TArith:: TArithActionFunc  TArith:: m_actionFcns[TAction::count] = {
        &TArith::add,
        &TArith::sub,
        &TArith::mul,
        &TArith::div
    };