C++ 函数指针-类内部和外部

C++ 函数指针-类内部和外部,c++,function,pointers,function-pointers,C++,Function,Pointers,Function Pointers,我是函数指针的noob,这是我第一次使用它 代码是: #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]); } 当我将pfunc分配给脉冲a时,我得到 错误:类型为“double(档位:)(double,double)”的参数与“d

我是函数指针的noob,这是我第一次使用它

代码是:

#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]);
}
当我将pfunc分配给脉冲a时,我得到

错误:类型为“double(档位:)(double,double)”的参数与“double(*)(double,double)”不匹配

对于
double(*pfunc)(double,double)=脉冲a

当我将pfunc分配给脉冲_b时,我得到了对啁啾的
未定义的参考(double,double)
对于
double(*pfunc)(double,double)=脉冲b


我做错了什么?

任何事情都不要使用函数指针。像正常人一样使用
std::function


此外,成员函数不是也永远不能是函数指针。它必须是一个静态函数。

您选择了一个极其复杂的示例作为您第一次尝试函数指针的例子。你应该从你能想到的最简单的例子开始

你的第一个指针

double (*pfunc)(double,double)=pulse_a;
按书面形式工作。它不会产生你描述的错误;我不知道它怎么可能产生您描述的错误(因为它不涉及
gear
),所以我打赌您发布的代码不是产生错误的代码。请不要那样做

指向函数的指针和指向成员函数的指针是不同的动物。它们有不同的类型,不能互换。不要试图把一个扔给另一个,否则你将违反古老的部落法(你将得到未定义的行为)

一旦掌握了这些指针的诀窍,您就可以通过
typedef
为自己省去一些麻烦:

typedef double (gear::*gearMemFn)(double, double);
void dynamics2(gearMemFn, double** , double, double);
...
gearMemFn pfunc2=&gear::pulse_b;

这就是确切的错误:/tmp/ccy2DvIL.o:函数'gear::roll(double**):/home/user/dir/time.cpp:13:未定义对'pulse_a(double,double)'集合的引用2:ld返回了我正在使用的1个退出状态,g++版本4.5.1 20101208(SUSE Linux),感谢您解释有关成员函数的详细信息。它解决了问题,没关系。我刚刚声明了函数,没有定义它。我的错。
void dynamics2(double (gear::*)(double, double), double** , double, double);
...
double (gear::*pfunc2)(double,double) = &gear::pulse_b;
dynamics2(pfunc2,&matrix[0],t,dt);
typedef double (gear::*gearMemFn)(double, double);
void dynamics2(gearMemFn, double** , double, double);
...
gearMemFn pfunc2=&gear::pulse_b;