Невозможно передать указатель на функцию-член класса в качестве аргумента другой функции-члена того же класса - PullRequest
0 голосов
/ 06 января 2020

Мне нужна помощь ... В комментариях заданы соответствующие вопросы. В программах нет ошибок и предупреждений компилятора !! У меня есть проблемы с вызовом функции-члена из другой функции-члена, используя указатели функций. (Если быть точным, setMatrixto () пытается вызвать функцию setElement () , используя указатель функции)

Плюс, каким-то образом "привет там" не печатается консоль. Я ожидал, что он будет отображаться как вывод. Возможно, setMatrixto () вообще не вызывается !!

Определение файла заголовка

#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 Файл реализации

#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?

    }

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

Основной файл

#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: я добавил все определения классов и основную функцию в одном файле. КАК НИ СТРАННО!! это работает . Я в замешательстве ?? !!!

#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;
}

1 Ответ

0 голосов
/ 08 января 2020

Нет ничего плохого в коде в обоих случаях. Просто мой отладчик не работал в режиме администратора. Я получил код ошибки 740. Поэтому я запустил IDE в режиме администратора и вуаля, он работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...