C++ 在类之间传递函数指针
我有两节课。 这是第一个C++ 在类之间传递函数指针,c++,C++,我有两节课。 这是第一个 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){
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);
};
正如您在示例中看到的,我在类1中有一个函数,我想从类2中的静态函数调用它,因为progresschange
是静态的,我只能使用函数指针调用类1中的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)
)
此外,必须对对象调用非静态
成员函数(如上面的one::change()
),因此您还需要提供一个one
对象来调用指向非静态
成员函数的对象
基本上,您可以通过在
two
中添加以下数据成员来实现所需:
void (one::*mem_func_ptr)(double);
one *obj_ptr;
也就是说,一个指向成员函数(mem_func_ptr
)的指针和一个指向调用此成员函数的对象(obj_ptr
)的指针。
要分配给成员函数指针,请执行以下操作:
mem_func_ptr = &one::change;
然后,以0.0
作为参数,在obj\u ptr
指向的对象上调用mem\u func\u ptr
指向的成员函数:
(obj_ptr->*mem_func_ptr)(0.0);
类似地,可以将一个对象的副本
one
保留为数据成员,而不是ponter。在这种情况下,您应该使用运算符*
而不是->*
错误消息非常简单:
错误:无法将分配中的void(one::*)(double)
转换为void(*)(double)
void one::change(double)
是类one
的成员函数,而不仅仅是一个函数。因此,您不能将指向此成员函数的指针(即:void(one::*)(double)
)分配给指向具有相同签名的函数的指针(即:指向void(*)(double)
)
此外,必须对对象调用非静态
成员函数(如上面的one::change()
),因此您还需要提供一个one
对象来调用指向非静态
成员函数的对象
基本上,您可以通过在
two
中添加以下数据成员来实现所需:
void (one::*mem_func_ptr)(double);
one *obj_ptr;
也就是说,一个指向成员函数(mem_func_ptr
)的指针和一个指向调用此成员函数的对象(obj_ptr
)的指针。
要分配给成员函数指针,请执行以下操作:
mem_func_ptr = &one::change;
然后,以0.0
作为参数,在obj\u ptr
指向的对象上调用mem\u func\u ptr
指向的成员函数:
(obj_ptr->*mem_func_ptr)(0.0);
类似地,可以将一个对象的副本
one
保留为数据成员,而不是ponter。在这种情况下,您应该使用操作符*
而不是->*
问题在于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);
问题在于
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);
std::function
救命@芭丝谢芭,你能再解释一点吗?谢谢,请跟我重复一遍:指向非成员函数的指针与指向成员函数的指针不同。指向非成员函数的指针与指向成员函数的指针不同。另外,对于以后的问题,请创建一个指针。我们可以复制粘贴的东西,然后自己查看错误。std::function
救命@芭丝谢芭,你能再解释一点吗?谢谢,请跟我重复一遍:指向非成员函数的指针与指向成员函数的指针不同。指向非成员函数的指针与指向成员函数的指针不同。另外,对于以后的问题,请创建一个指针。我们可以复制粘贴并自己查看错误的东西。谢谢,但我在两种方法中都遇到了错误,tw->functionpointer=std::bind(std::mem\u fn(&one::change),\u 1,one\u实例);tw->functionpointer=[&one_instance](双x){one_instance->change(x);}都会给我错误。我只是传递了这个而不是一个_实例,第一个方法中的_1是什么?是的,用类1的某个实例替换一个_实例。如果您使用的是类1的方法,那么这就很好了_1是一种告诉bind参数位于第一个位置的方法。这允许您对参数重新排序或替换某些任意参数。查看文档了解更多详细信息。另外,如果您需要有关错误的帮助,请发布此消息。谢谢,我修复了_1的问题,但它说无法将'std::_Bind_helper::type{aka std::_Bind}'转换为'void(*)(双精度)'在赋值中^谢谢,但我在两种方法中都遇到了错误,tw->functionpointer=std::bind(std::mem\u fn(&one::change),_1,一个实例);tw->functionpointer=[&one_instance](双x){one_instance->change(x);}都会给我错误。我只是传递了这个而不是一个_实例,第一个方法中的_1是什么?是的,用类1的某个实例替换一个_实例。我觉得这很好用