我需要在另一个类中使用一个类中定义的函数。我没有重写整个函数,而是尝试将函数作为指针传递,如下所示:
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)>
.现在它可以容纳任何接受单个 int
的可调用(函数指针、仿函数、lambda)作为参数,并返回 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;
关于c++ - 如何在另一个类或结构中使用类函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24372134/