繁体   English   中英

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

[英]How to call a C++ function pointer from C?

我在上一篇文章中成功地最终能够在我的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代码并摆脱该错误的最佳方法是什么?

谢谢

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

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

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

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

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

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

你有2个选择:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM