首页 > 解决方案 > 指向成员的指针对托管类无效

问题描述

我创建了一个库,其中一个公开的函数接受类型为 的函数指针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;
}

处理这个的正确方法是什么?

标签: c++visual-c++function-pointersmanaged-c++

解决方案


奇怪行为的原因是每个成员函数都隐式地在其签名中附加了一个指向其类型的指针,例如:

#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*到函数中,因此您可能会有某种全局状态(例如,使该函数成为静态并让它仅在静态数据上工作)。


推荐阅读