c++ - 指向成员的指针对托管类无效
问题描述
我创建了一个库,其中一个公开的函数接受类型为 的函数指针void(*fun_ptr)(int)
。
函数语法为:
start_server(char *devices, char *folder, int number, int timeout, void(*status_of_server)(int));
这适用于普通的 C++ 函数,void getStatus(int n);
但是当我在 Visual C++ 环境中为 GUI 应用程序使用它们时,我收到了这个错误:
指向成员的指针对托管类无效
start_server(&devs, &base, 1, 0, &TestApplication::MainWindow::StatusOfServer );
WhereStatusOfServer
定义在MainWindow
类内部,可用于 UI 管理。
private: void TestApplication::MainWindow::StatusOfServer(int n)
{
this->progressBar->Value = n;
}
处理这个的正确方法是什么?
解决方案
奇怪行为的原因是每个成员函数都隐式地在其签名中附加了一个指向其类型的指针,例如:
#include <iostream>
struct S
{
int i;
void doSth() { std::cout << i << std::endl; }
};
int main()
{
S s{1};
s.doSth();
auto member_f = &S::doSth;
(s.*member_f)();
}
doSth()
有一个隐藏参数,所以不能像普通函数一样调用。在您的示例中,情况类似 - 您试图调用成员函数,就好像它是一个正常的自由函数一样,这是行不通的。通常在请求函数指针的 API 中,函数可以void*
作为参数,这允许您编写一个包装器,将指针转换为正确的类型,然后在指向的类实例上调用成员函数。但是,从上面显示的代码中,您无法传递void*
到函数中,因此您可能会有某种全局状态(例如,使该函数成为静态并让它仅在静态数据上工作)。
推荐阅读
- python - 为什么我收到 MySQL 语法错误?
- java - ApexCharts Vue - 热图图表 - 缩放时间线
- javascript - 在 react-testing-library 中运行单元测试时出现意外的标识符
- spring - 如何在 Spring Boot 微服务中根据查询字符串值选择数据源
- r - 尝试从矩阵打印位置并在它们之间放置逗号
- python - 创建一个python卷积核
- ios - 如何更改 UICollectionView 中某个部分的背景颜色?
- java - 构建保险箱时Maven编译错误
- python-3.x - python中的Singer模块 - 我如何让它运行?
- python - 在 pandas 中读取 csv 文件时出现问题,数据显示不正确