2013-03-18 2 views
0

Я хочу создать метод для (математического) матричного класса для обработки объектов с помощью функции, указанной в параметре, но я застрял с указателями функций!Передача функции в качестве параметра методу в C++

Мой код:

#include <iostream> 
class Matrix{ 
    public: 
    Matrix(int,int); 
    ~Matrix(); 
    int getHeight(); 
    int getWidth(); 
    float getItem(int,int); 
    void setItem(float,int,int); 
    float getDeterminans(Matrix *); 
    void applyProcessOnAll(float (*)()); 
    private: 
    int rows; 
    int cols; 
    float **MatrixData; 
}; 

Matrix::Matrix(int width, int height){ 
    rows = width; 
    cols = height; 
    MatrixData = new float*[rows]; 
    for (int i = 0;i <= rows-1; i++){ 
    MatrixData[i] = new float[cols]; 
    } 
} 

Matrix::~Matrix(){} 
int Matrix::getWidth(){ 
    return rows; 
} 
int Matrix::getHeight(){ 
    return cols; 
} 
float Matrix::getItem(int sor, int oszlop){ 
    return MatrixData[sor-1][oszlop-1]; 
} 
void Matrix::setItem(float ertek, int sor, int oszlop){ 
    MatrixData[sor-1][oszlop-1] = ertek; 
} 
void Matrix::applyProcessOnAll(float (*g)()){ 
    MatrixData[9][9]=g(); //test 
} 
float addOne(float num){ //test 
    return num+1; 
} 

int main(void){ 
    using namespace std; 
    cout << "starting...\r\n"; 
    Matrix A = Matrix(10,10); 
    A.setItem(3.141,10,10); 
    A.applyProcessOnAll(addOne(3)); 
    cout << A.getItem(10,10); 
    cout << "\r\n"; 
    return 0; 
} 

Компилятор дает мне эту ошибку: ошибка: нет подходящей функции для вызова 'Matrix :: applyProcessOnAll (флоат)' примечание: кандидат является: примечание: пустота Матрица :: applyProcessOnAll (с плавающей точкой ()()) примечание: нет известного преобразования для аргумента 1 от 'поплавка' до 'поплавка ()()'

Спасибо за помощь!

Теперь это работает! Благодаря!

Модифицированные ЧАСТИ

void Matrix::applyProcessOnAll(float (*proc)(float)){ 
    for(int i = 0; i <= rows-1;i++) 
     for(int j = 0; j <= cols-1;j++) 
      MatrixData[i][j]=proc(MatrixData[i][j]); 
} 

и главный:

A.applyProcessOnAll(*addOne); 
+0

Вы не передаете функцию 'applyProcessOnAll', вы передаете возвращаемое значение' addOne' при вызове с '3'. – enobayram

ответ

2

Поскольку ваш float (*g)() не принимает аргумент и ваш addOne принимает float аргумент. Измените указатель на float (*g)(float) и теперь он должен работать.

Также вы должны назначить функцию указателю и не называть его.

A.applyProcessOnAll(&addOne, 3); //add args argument to `applyProcessOnAll` so you can call `g(arg)` inside. 
+1

спасибо! Это сработало! –

0

У вас есть две проблемы.

Первый указывает на Tony The Lion: вы указали, что функция не должна принимать никаких параметров, но вы используете функцию, которая принимает один параметр.

Во-вторых, вы вызываете applyProcessOnAll с результатами вызова функции, а не указателем на функцию.

Смежные вопросы