如何使用参数将一个函数从一个结构传递到另一个结构中的另一个函数

时间:2019-04-16 10:13:43

标签: c++

我正在学习将函数作为参数传递的概念。

首先,我尝试传递“免费功能?” (不属于任何类或结构的函数)到使用此指针void(*Func)(int)的另一个自由函数,它就起作用了。

第二,函数的自由函数也属于使用相同指针的结构,

但是,当我尝试使用相同的指针将结构中的一个函数传递给另一个结构中的另一个函数时,则会提示错误。

这是我的代码:

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <conio.h>

using namespace std;

struct A {
    void Func_A (void (*Func)(int)) {
        (*Func)(5);
    }
};

struct B {
    void Func_B (int a) {
        cout<<a;
    }
};

int main () {
    A a;
    B b;
    a.Func_A(b.Func_B);
    char key = getch();
    return 0;
}

出现错误提示:

[Error] no matching function for call to 'A::Func_A(<unresolved overloaded function type>)'

2 个答案:

答案 0 :(得分:1)

考虑以下示例:

#include <iostream>
using namespace std;

struct A {
    void Func_A (void (*Func)(int)) {
        (*Func)(5);
    }
};

struct B {
  int x;
  void Func_B (int a) {
    cout << a << " " << x;
  }
};

int main () {
    A a;
    B b1;
    b1.x = 1;
    B b2;
    b2.x = 2;
    a.Func_A(b1.Func_B);
    return 0;
}

在该示例中,Func_B同时使用输入a和数据成员x,因此很明显,调用func_B的结果取决于对象(如果是b1或b2在调用它)。

您可能会认为,使用函数指针“ b1.Func_B”将澄清您的意思是与b1对象关联的函数,但这不起作用,因为成员函数对于每个实例并不单独存在。函数Func_B在内存中仅存在一次,因此无法为“ b1.Func_B”和“ b2.Func_B”使用单独的函数指针。因此,它不起作用。

g ++ 8.2.0编译器在代码中的a.Func_A(b1.Func_B);行中给出以下错误消息:

error: invalid use of non-static member function ‘void B::Func_B(int)’

暗示可以对静态成员函数执行此类操作。这是有道理的,因为静态成员函数无法利用任何实例的数据成员,因此它更像是“自由函数”,而不依赖于任何实例。

答案 1 :(得分:1)

要传递一个非静态成员函数,语法略有不同。这是您的原始代码,经过重新整理以显示此代码:

#include <iostream>

struct B {
    void Func_B (int a) {
        std::cout << a;
    }
};

struct A {
    void Func_A (void (B::*Func)(int), B &b) {
        (b.*Func) (5);
    }
};

int main () {
    A a;
    B b;
    a.Func_A (&B::Func_B, b);
    return 0;
}

请注意Func_A的不同函数签名,并且在调用时必须传递类B的实例。

Live demo

您不能使用C ++ 11,真是遗憾。 std::function使这一过程变得更加简单和笼统。