0

(数学的な)行列クラスがパラメーターで指定された関数を使用してオブジェクトを処理するためのメソッドを作成したいのですが、関数ポインターで立ち往生しています!

私のコード:

#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(float)'の呼び出しに一致する関数がありません注:候補は:注:void Matrix :: applyProcessOnAll(float()())注:引数の既知の変換はありません1'float'から'float()()' </ p>

助けてくれてありがとう!

今それは動作します!ありがとう!

変更された部品

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);
4

2 に答える 2

2

あなたfloat (*g)()は引数を取らず、あなたは引数をaddOne取るからfloatです。関数ポインタを に変更すると、機能float (*g)(float) するはずです。

また、関数をポインターに割り当て、呼び出してはいけません。

A.applyProcessOnAll(&addOne, 3); //add args argument to `applyProcessOnAll` so you can call `g(arg)` inside.
于 2013-03-18T15:56:54.987 に答える
0

2 つの問題があります。

1 つ目は、 Tony The Lionが指摘したものです。関数がパラメーターをとらないように指定しましたが、単一のパラメーターを受け取る関数を使用しています。

2 つ目はapplyProcessOnAll、関数へのポインターではなく、関数呼び出しの結果を使用して呼び出していることです。

于 2013-03-18T16:01:01.380 に答える