Search code examples
c++function-pointerspointer-to-member

Unable to pass a function pointer to a member function of the class as an argument to another member function of the same class


I need help... appropriate questions have been asked in the comments. The programs has zero compiler errors and warnings!! I have concerns with calling a member function from another member function using function pointers. (To be precise, setMatrixto() is trying to call setElement() function using function pointer)

Plus somehow the "hello there" is not being printed to the console. I was expecting it to show up as output.Maybe the setMatrixto() is not getting called at all!!

Header File definition

#ifndef MATRIXOPERATIONS_H
#define MATRIXOPERATIONS_H

class MatrixOperations;

typedef int (MatrixOperations::*INTFUNC)(int,int);
typedef void (MatrixOperations::*VOIDFUNC)(int,int,int);

class MatrixOperations
{
    public:
        MatrixOperations();
        MatrixOperations(int size);
        ~MatrixOperations();

        //diagonal matrix funtions
        void displayMatrixOf(INTFUNC f);
        void setMatrixTo(VOIDFUNC f);

        int getElement(INTFUNC from, int i, int j);
        void setElement(VOIDFUNC to,int i ,int j, int value);

        int fromDiagonalArray(int i, int j);
        void toDiagonalArray(int i, int j, int value);
    protected:

    private:
        int size;
        int* a;

};



#endif // MATRIXOPERATIONS_H

CPP Implementation File

#include "MatrixOperations.h"
#include <iostream>
using namespace std;


MatrixOperations::MatrixOperations()
{
    //ctor
    size = 3;
    a = new int[size];



}
MatrixOperations::MatrixOperations(int size)
{
    //ctor
    this->size = size;
    a = new int[size];


}


MatrixOperations::~MatrixOperations()
{
    //dtor
    delete[] a;
}




///////////////////FUCNTION POINTER SECTION///////////////////////////////////
int MatrixOperations::getElement(INTFUNC from, int i, int j)
{
    return (this->*from)(i,j);

}

void MatrixOperations::setElement(VOIDFUNC to,int i ,int j, int value)
{

    (this->*to)(i,j,value);
}




/////////////////////////////////DIAGONAL ARRAY OPERATIONS/////////////////////////////////////////////////
int MatrixOperations::fromDiagonalArray(int i, int j)
{
    if(i==j)
    {
        return a[i];
    }
    else
    {
        return 0;

    }
}
void MatrixOperations::toDiagonalArray(int i, int j, int value)
{
    a[i] = value;
}

///////////////////////////////////////////////////////////////////
void MatrixOperations::displayMatrixOf(INTFUNC f)
{
    for(int i{0}; i < size; i++)
    {
        for(int j{0}; j < size; j++)
        {
            cout << getElement(f,i,j) << "\t"; //is this the correct way to send the function pointer?
        }
        cout << endl;
    }

}

void MatrixOperations::setMatrixTo(VOIDFUNC f)
{
    cout << "Hello there!!";                      //not getting this output.. whats wrong??
    for(int i{0}; i < size; i++)
    {


            int value {};
            cout << "Enter value diagonal element " << i << " : ";
            cin >> value;
            setElement(f,i,i,value);             //is this the correct way to send the function pointer?

    }

}
///////////////////////////////////////////////////////////////////////////////

Main File

#include <iostream>
#include "MatrixOperations.h"

typedef MatrixOperations MATRIX;


using namespace std;

int main()
{
    MATRIX m1;

    m1.setMatrixTo(MATRIX::toDiagonalArray); //was expecting a "Hello there!" but i am not getting that output either
    return 0;
}

EDIT2: I added all the class definitions and main function in one single file. SURPRISINGLY!! this works . I am confused??!!!

#include <iostream>

using namespace std;

class MatrixOperations;

typedef void (MatrixOperations::*VOIDFUNC)(int,int,int);
typedef MatrixOperations MATRIX;

class MatrixOperations
{
    public:
        MatrixOperations();
        MatrixOperations(int size);
        ~MatrixOperations();


        //diagonal matrix funtions

        void setMatrixTo(VOIDFUNC f);
        void setElement(VOIDFUNC to,int i ,int j, int value);
        void toDiagonalArray(int i, int j, int value);
    private:
        int size;
        int* a;

};
MatrixOperations::MatrixOperations()
{    //ctor
    size = 3;
    a = new int[size];
}
MatrixOperations::MatrixOperations(int size)
{    //ctor
    this->size = size;
    a = new int[size];
}
MatrixOperations::~MatrixOperations()
{
    //dtor
    delete[] a;
}
void MatrixOperations::setElement(VOIDFUNC to,int i ,int j, int value)
{

    (this->*to)(i,j,value);
}




/////////////////////////////////DIAGONAL ARRAY OPERATIONS/////////////////////////////////////////////////
void MatrixOperations::toDiagonalArray(int i, int j, int value)
{
    a[i] = value;
}

///////////////////////////////////////////////////////////////////
void MatrixOperations::setMatrixTo(VOIDFUNC f)
{
    cout << "Hello there!!" << endl;
    for(int i{0}; i < size; i++)
    {


            int value {};
            cout << "Enter value diagonal element " << i << " : ";
            cin >> value;
            setElement(f,i,i,value);

    }

}

int main()
{

    MATRIX m1;

    m1.setMatrixTo(MATRIX::toDiagonalArray);
    return 0;
}

Solution

  • There is nothing wrong with the code in both cases. Its just my debugger was not running in admin mode. I got error code 740. So I launched my IDE in admin mode and voila it worked.