c++ - 函数指针 - 类的内部和外部

标签 c++ function pointers function-pointers

我是函数指针的菜鸟,这是我第一次使用它。

代码是:

#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 时,我得到

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/

相关文章:

C Grid 使用指针和 Malloc

c++ - vector 和 map 抛出异常

c++ - 如何将对 int8_t 的引用转换为对 uint8_t 的引用?

c - 如何在 C 中只读取文件中的数字直到 EOF

javascript - 如何在不反转标点符号的情况下反转字符串?

c++ - 在 C++ 中使用指针时,对象属性未按预期更改

c++ - 用于函数对和模板特化的 RAII 包装器

c++ - 需要帮助将滚动条添加到编辑框

JavaScript 函数/事件监听器无法正常运行

c - 修复内存泄漏