如何从C调用C ++函数指针?

时间:2010-06-21 01:30:47

标签: c++ c

我成功地最终能够在previous post here的C ++项目中使用PDcurses库中的TUI头。

现在在我班上我包括C头:

#include "tui.h"

tui在C中并具有菜单的定义:

typedef struct 
{
    char *name; /* item label */
    FUNC  func; /* (pointer to) function */
    char *desc; /* function description */
} menu;

所以在MainView.cpp中我有:

void sub0()
{
    //domenu(SubMenu0);
}

void sub1()
{
    //domenu(SubMenu1);
}


void MainView::showMainMenu()
{
    menu MainMenu[] =
    {
        { "Users", sub0, "Manage Users" },
        { "Accounts", sub1, "Manage Accounts" },
        { "Items", sub1, "Manage Items" },
        { "Staff", sub1, "Manage Staff" },
        { "", (FUNC)0, "" }  
    };
    startmenu(MainMenu, "Library System 1.0");
}

这是按预期工作的。

问题是我需要在sub0()和sub1()中调用我的类方法。

我试图为我的类定义C ++方法来尝试替换sub0和sub1 用:

void MainView::sub0()
{
    //domenu(SubMenu0);
}
void MainView::sub1()
{
    //domenu(SubMenu1);
}

编译器抛出此错误:

error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'FUNC'
None of the functions with this name in scope match the target type

将这些函数指针传递给C代码并摆脱该错误的最佳方法是什么?

感谢

2 个答案:

答案 0 :(得分:5)

C ++类对象有一个“this”指针,它作为类成员函数的第一个参数被无形地传递。这意味着您不能将非静态成员函数用于带有0个参数的C样式函数指针。

所以解决这个问题,你有几个选择。在告诉你哪一个之前我需要更多细节。

  • 使您想要在C代码中使用的函数静态。
  • 使用boost或tr1或其他一些允许使用this指针绑定成员函数的C ++库。使用boost,这看起来像:

    { "Users", boost::bind(&MainView::sub0, this), "Manage Users" },
    
  • 您可以修改代码以传递对类对象的引用以及这些函数指针。如果是这样,您可以直接在所需对象上调用回调。看起来您正在与窗口管理器打交道,因此您可能无法进行此方法所需的更改。

  • 你最终会做的是某种解决方法,包括将指针存储到你正在使用的对象,然后编写访问该指针的小存根函数,然后调用它上面的成员函数。一些(我敢说,大多数)窗口管理器允许您为此目的包含一个指向任意数据的指针。

答案 1 :(得分:2)

我认为不可能将非静态成员函数作为FUNC指针传递。因为编译器会将 this 指针传递给所有非静态成员函数。

您有两个选择:

  1. 将您的sub0和sub1保持在类中并使其保持静态
  2. 将您的sub0和sub1移出课堂。在需要访问sub0 / sub1中的其他成员变量/函数的情况下,将指针传递给您的类(也称为 this )。