我有两个claces。 这是第一个
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
是静态的我只能在第一类中调用change
函数函数指针。但它没有用,编译说
error: cannot convert ‘void (one::*)(double)’ to ‘void (*)(double)’ in assignment
它发生在这一行
tw->functionpointer=&change;
我怎样才能让它发挥作用。甚至可以使用此方法将函数指针传递给另一个类的函数? 感谢
答案 0 :(得分:4)
错误信息非常简单:
错误:无法在作业中将
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
)和指向该对象的指针,用于在上调用此成员函数({{1} })。
要分配给成员函数指针:
obj_ptr
然后,将mem_func_ptr = &one::change;
指向的成员函数调用mem_func_ptr
指向的对象,并将obj_ptr
作为参数:
0.0
可以通过将对象(obj_ptr->*mem_func_ptr)(0.0);
的副本保留为数据成员而不是ponter来类似地完成。在这种情况下,您应该使用运算符one
而不是.*
。
答案 1 :(得分:3)
问题是one::change()
是一个类成员,所以你需要将指针传递给一个类实例。
现代化的方法是使用std::function
,std::bind
和std::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); }