传递类之间的函数指针

时间:2018-01-24 08:46:20

标签: c++

我有两个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;

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

2 个答案:

答案 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::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); }