如何在另一个类或结构中使用类函数指针

How to use a class function pointer in another class or struct?

本文关键字:类函数 指针 结构 另一个      更新时间:2023-10-16

我需要在另一个类中使用在一个类中定义的函数。我没有重写整个函数,而是尝试将函数作为指针传递,如下所示:

class C {
  public:
    int get(int x) { return x*x; }
};
struct S {
    int (*func) (int x);
};
int main() {
    C c;
    S s;
    cout << c.get(3) << endl;
    s.func = &C::get;
    cout << s.func(3) << endl;
    return 0;
}

这不起作用并给出以下错误:

func_ptr.cpp: In function ‘int main()’:
func_ptr.cpp:42:18: error: cannot convert ‘int (C::*)(int)’ to ‘int (*)(int)’ in assignment

有可能这样做吗?如果有,我该如何修复它?此外,如果可能的话,我可以使用对象实例的指针而不是类吗?也就是说,可能使用在特定类实例中定义的变量。谢谢。

C::get()是一个非静态成员函数,这意味着它必须在C的实例上调用。它有一个隐式的第一个参数,this指针,在调用函数时必须传递给它。

因为你的C::get()似乎不需要访问C的任何数据成员,你可以使它成为static的成员函数。

static int get(int x) { return x*x; }

现在你的代码可以正常工作了。


另一个选择是修改func,使其成为指向C成员函数的指针

struct S {
    int (C::*func) (int x);
};

并调用

s.func = &C::get;
std::cout << (c.*(s.func))(3) << std::endl;

另一种选择是将S::func的类型更改为std::function<int(int)>。现在它可以保存任何可调用(函数指针、函函数、lambda),这些可调用以单个int作为参数,并返回一个int

struct S {
    std::function<int(int)> func;
};
s.func = std::bind(&C::get, &c, std::placeholders::_1);
std::cout << s.func(3) << std::endl;

普通函数和成员函数有点不同。要使用成员函数,你需要一个对象来调用它(即成员函数体中的this指针)。

看看std::function和std::bind,它们被用来以统一的方式处理函数(可调用的)实体。它们可以管理全局函数、静态成员函数、lambda、常规成员函数、函子,以及任何可以像函数一样调用的函数。

  • http://en.cppreference.com/w/cpp/utility/functional/function
  • http://en.cppreference.com/w/cpp/utility/functional/bind
  • http://en.cppreference.com/w/cpp/header/functional

例如:

struct S
{
    std::function<int(int)> func;
};
C c;
S s;
s.func = std::bind( &C::get, &c, std::placeholders::_1 );

如果你可以使用STL,那么你可以使用std::function来保存指向函数的指针,std::bind来将特定指针绑定到特定函数。它使您的代码看起来更干净。bind同时查找静态和非静态成员函数。对于非静态成员函数,需要传递对象引用,以便它能够指向正确的地址。

下面的代码片段展示了如何使用它:

std::bind(ClassName::MemberFunctionName, object, std::placeholders::_1)

std::placeholders::_1表示::MemberFunctionName接受一个参数。