0

私は関数ポインタの初心者であり、これを使用するのはこれが初めてです。

コードは次のとおりです。

#include "time.cpp"
int main(){
 double** matrix= new double*[10];
 for (int i=0; i<10; i++) matrix[i]=new double[10];
 gear nit;
 nit.roll(&matrix[0]);
}

time.cpp

double pulse_a (double t, double dt);

class gear{
        void dynamics(double (*)(double, double), double** , double, double);
        double pulse_b(double t, double dt);
public:
        int net;
        void roll(double** matrix);
};

void gear::roll(double** matrix){
        double t,dt;
        double (*pfunc)(double,double)=pulse_a; //or pulse_b
        dynamics(pfunc,&matrix[0],t,dt);
}

void gear::dynamics(double (*pulse)(double , double ), double** matrix, double t, double dt){

pulse(t,dt);
}

pfuncをpulse_aに割り当てると、次のようになります。

エラー:タイプ'double(gear ::)(double、double)'の引数が'double(*)(double、double)'と一致しません</ p>

にとって double (*pfunc)(double,double)=pulse_a;

pfuncをpulse_bに割り当てるとundefined reference to chirp(double, double)'double (*pfunc)(double,double)=pulse_b;

私は何が間違っているのですか?

4

2 に答える 2

3

関数ポインターへの最初の進出として、途方もなく複雑な例を選択しました。考えつく最も単純な例から始めるべきです。

あなたの最初のポインター

double (*pfunc)(double,double)=pulse_a;

書かれたとおりに動作します。あなたが説明したエラーは発生しません。あなたが説明したエラーがどのように発生する可能性があるのか​​ わかりません(gear. お願い、それはやめて。

関数へのポインターとメンバー関数へのポインターは別の動物です。それらにはさまざまな種類があり、互換性はありません。1 つを別のものにキャストしようとしないでください。そうしないと、古代の部族法に違反することになります (未定義の動作が発生します)。

void dynamics2(double (gear::*)(double, double), double** , double, double);
...
double (gear::*pfunc2)(double,double) = &gear::pulse_b;
dynamics2(pfunc2,&matrix[0],t,dt);

これらのポインタのコツをつかめば、次の方法で頭の痛い問題を解決できますtypedef

typedef double (gear::*gearMemFn)(double, double);
void dynamics2(gearMemFn, double** , double, double);
...
gearMemFn pfunc2=&gear::pulse_b;
于 2012-10-21T15:44:43.727 に答える
0

関数ポインターは何にも使用しないでください。std::function普通の人のように使用してください。

また、メンバー関数は関数ポインターではなく、決して関数ポインターになることはできません。これは静的関数でなければなりません。

于 2012-10-21T14:45:40.533 に答える