我是函数指针的菜鸟,这是我第一次使用它。
代码是:
#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]);
}
时间.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 时,我得到 p>
error: argument of type ‘double (gear::)(double, double)’ does not match ‘double (*)(double, double)’
double (*pfunc)(double,double)=pulse_a;
当我将 pfunc 赋给 pulse_b 时,我得到 undefined reference to chirp(double, double)'
对于 double (*pfunc)(double,double)=pulse_b;
我做错了什么?
最佳答案
您为第一次涉足函数指针选择了一个复杂得离谱的示例。您应该从您能想到的最简单的示例开始。
你的第一个指针
double (*pfunc)(double,double)=pulse_a;
按书面规定工作。它不会产生您描述的错误;我看不出它怎么可能产生您描述的错误(因为它不涉及 gear
),所以我敢打赌您发布的代码不是产生错误的代码。请不要那样做。
指向函数的指针和指向成员函数的指针是不同的动物。它们有不同的类型,不能互换。不要试图将一个转换为另一个,否则您将违反古老的部落法(并且您将得到未定义的行为)。
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;
关于c++ - 函数指针 - 类的内部和外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12998845/