如何在另一个类或结构中使用类函数指针
How to use a class function pointer in another class or struct?
我需要在另一个类中使用在一个类中定义的函数。我没有重写整个函数,而是尝试将函数作为指针传递,如下所示:
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接受一个参数。
- 带有类的函数指针
- 通过函数指针定义类范围之外的方法
- 从类成员函数到类 C 函数指针的转换
- 返回类函数指针 c++
- 在映射中存储模板类函数指针
- 模板类函数指针类型别名
- C++ - 基类函数指针调用的替代方法
- 是否可以使用包含{sub,super}类函数指针的回调表
- 通过基类函数指针调用派生类
- 类函数指针作为参数
- C++中抽象成员和类函数指针的深层复制构造函数
- 将类函数指针传递到另一个类
- 通过 VC++ 中的类 A 函数指针调用类成员函数(类 B)
- 没有为c++类函数指针注册python类
- 如何在另一个类或结构中使用类函数指针
- 如何:类函数指针(c++)
- 使用基类函数指针访问派生类成员函数
- 调用与父类函数指针同名的函数
- boost绑定类函数指针
- 如何从另一个类的函数中获取非静态函数的类函数指针?