Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类之间传递函数指针_C++ - Fatal编程技术网

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的某个实例替换一个_实例。我觉得这很好用