c++ - 将成员函数作为参数传递错误:“必须调用对非静态成员函数的引用”
问题描述
我是 C++ 新手,想知道如何将一个类的成员函数传递给另一个以函数指针作为参数的函数。对于我尝试的代码,我收到“必须调用对非静态成员函数的引用”的错误。
编辑:将函数设为静态可以解决问题,但是我将无法访问类中定义的变量。
file.cpp:
#include "fooHdr.h"
class bar {
void clbck()
{
// Do something
}
void init()
{
foo(clbck());
}
};
fooHdr.h:
void foo(void (*hndlr)());
fooHdr.c
void foo(void (*hndlr)()) { };
解决方案
成员函数指针不同于普通函数指针。一个普通的函数指针如下所示:
void foo() {}
void (*Func)() = foo; // Function pointer.
成员函数指针如下所示:
class MemberTest {
public:
void foo() {}
};
void (MemberTest::*Func)() = &MemberTest::foo; // Member function pointer. Notice the '&' operator here.
int main()
{
MemberTest test;
(test.*Func)(); // This is how to call member function pointers.
}
因此,对于您的问题,您需要将其定义为成员函数指针,而不是像普通函数指针:
void foo(void (bar::*hndlr)());
并且在调用foo()
函数时,必须返回成员函数的地址:
void init()
{
foo(&bar::clbck);
}
但是,您仍然不能foo()
像这样调用该函数,因为它没有bar
对象的当前实例。所以我们必须创建另一个参数来获取指向当前对象的指针:
void foo(bar* pBar, void (bar::*hndlr)());
...
foo(this, &bar::clbck);
所以现在,当从 调用成员函数时foo()
,你可以这样做:
(pBar->*hndlr)();
注意:在函数顶部添加前向声明,foo()
否则编译器可能会抱怨说bar
未定义。
推荐阅读
- reactjs - 如何为 axios 请求构建完整的授权标头?
- sockets - (Socket.io) 我应该如何优化命名空间的数量?
- java - 如何使用 JAVA 从 REST API 调用中打印/读取图像
- javascript - 在javascript上按日期读取文件名
- python - 32位pyodbc Access DB连接字符串的正确格式?
- jenkins - 基于groovy方法的Jenkins动态参数
- r - 将 NA 插入 R 中的特定行和列
- flutter - 如何通过 Dart/Flutter 中的“application/octet-stream”将 png 文件发送到 Microsoft Custom Vision?
- .net - window.external 在指向本地 Angular 8 网站的 WPF WebBrowser 中有效,但在部署时无效
- rust - Rust - 从方法中获取价值而不借用(计算文件的行数)