在类之间传递函数指针
pass a function pointer between classes
我有两个鞋带。 这是第一个
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::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); }
- 如何使用指针传递给函数的数组中对象的函数成员
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 将唯一指针的指针传递给采用双指针的函数
- 将 char 指针传递给接受对 char 数组的引用的函数
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 将指针传递到成员的指针,从模板参数包到函数对象
- 如何通过指针传递lambda函数?
- 谁拥有作为指向 Windows API 函数的指针传递的值?
- 模板到函数的时刻地址是否可以作为指向某个函数的函数指针传递?
- 通过作为指向 C++ 函数的指针传递来访问 std::array 元素的正确方法是什么?
- 如何将函数指针传递给方法,以便它可以在Qt的connect()中使用?
- 将指向多维数组向量中的单个项的指针传递给函数 c++
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 如何将指向 C 中函数的"DEFINED"常量的指针传递给函数?
- 将函数指针作为函数参数传递的目的
- 将字符串指针传递到C++和Xcode 11.1中不同线程上运行的函数
- 将类指针传递给函数
- 将指针传递给函数 - 为什么我无法打印地址?
- 为什么这是一个按指针传递函数
- 通过指针传递函数参数