在类之间传递函数指针

pass a function pointer between classes

本文关键字:指针 传递函数 之间      更新时间:2023-10-16

我有两个鞋带。 这是第一个

class one{
one(){ }
public:
void change(double a){
//print a
}
void run(){
two tw;
tw->functionpointer=&change;
}
};

这是two

public two{
two();
static void progresschange(double v){
functionpointer(v);
}
public:
void (*functionpointer)(double);
};

正如您在示例中所看到的,我在第一类中有一个函数,我想从第二类中的静态函数调用它 由于progresschange是静态的,我只能在第一类uisng函数指针中调用change函数。 但它不起作用并编译说

error: cannot convert ‘void (one::*)(double)’ to ‘void (*)(double)’ in assignment 

它发生在这一行

tw->functionpointer=&change;

我怎样才能让它工作。 甚至可以使用此方法使用函数指针将函数传递给另一个类? 谢谢

错误消息非常简单:

错误:无法在分配中将void (one::*)(double)转换为void (*)(double)

void one::change(double)是类one的成员函数,而不仅仅是一个函数。因此,不能将指向此成员函数的指针(即:void (one::*)(double))分配给指向具有相同签名的函数的指针(即:指向void (*)(double))。

此外,必须在对象上调用非static成员函数(如上面的one::change()),因此您还需要提供一个one对象来调用指向非static成员函数。


基本上,您可以通过在two中添加以下数据成员来实现您想要的:

void (one::*mem_func_ptr)(double);
one *obj_ptr;

也就是说,指向成员函数(mem_func_ptr) 的指针和指向要调用此成员函数的对象的指针(obj_ptr)。 分配给成员函数指针:

mem_func_ptr = &one::change;

然后,在obj_ptr指向的对象上调用mem_func_ptr指向的成员函数,0.0作为参数:

(obj_ptr->*mem_func_ptr)(0.0);

可以通过将对象的副本one作为数据成员而不是 ponter 来类似地完成。在这种情况下,您应该使用运算符.*而不是->*

问题是one::change()是一个类成员,所以你也需要传递一个指向类实例的指针。

现代方法是使用std::functionstd::bindstd::mem_fn

class two {
....
std::function<void(double)> functionpointer;
}

tw->functionpointer = std::bind(std::mem_fn(&one::change), _1, one_instance);

或者,您可以使用 lambda 函数:

tw->functionpointer = [&one_instance](double x) { one_instance->change(x); }