Как назвать указатель функции C++ от C?

Мне должно было успешно наконец удаться использовать заголовок TUI из библиотеки PDcurses в моем проекте C++ в предыдущем сообщении здесь.

теперь в моем классе я включаю заголовок 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, кодируют и избавляются от той ошибки?

спасибо

7
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

Объекты класса C ++ имеют указатель this, который невидимо передается в качестве первого аргумента функции-члену класса. Это означает, что вы не можете использовать нестатическую функцию-член для указателя функции в стиле C, который принимает 0 аргументов.

Итак, решите это, у вас есть несколько вариантов. Мне нужно больше подробностей, прежде чем я расскажу, какой из них выбрать.

  • Сделайте функции, которые вы хотите использовать в коде C, статическими.
  • Используйте boost или tr1 или какую-либо другую библиотеку C ++, которая позволяет связывать функции-члены с их указателем this. С boost это будет выглядеть так:

     {"Пользователи", boost :: bind (& MainView :: sub0, this), "Управление пользователями"},
    
  • Вы можете изменить свой код, чтобы передавать ссылку на объект класса вместе с указателями на функции. В таком случае вы можете вызывать обратные вызовы непосредственно для нужного объекта. Однако похоже, что вы имеете дело с оконным менеджером, и поэтому вы, вероятно, не сможете внести изменения, необходимые для работы этого подхода.

  • Вероятно, в конечном итоге вы будете заниматься чем-то вроде работы, включая сохранение указателя на объект, который вы где-то используете, а затем написание небольших функций-заглушек, которые обращаются к этому указателю и затем вызывают для него функцию-член. Некоторые (осмелюсь сказать, большинство) оконных менеджеров позволяют вам включать указатель на произвольные данные с помощью обратного вызова для этой цели.
5
ответ дан 7 December 2019 в 07:40
поделиться

Я не думаю, что можно передать нестатическую функцию-член как указатель FUNC. Поскольку компилятор передаст указатель this всем нестатическим функциям-членам.

У вас есть 2 варианта:

  1. Оставить sub0 и sub1 в классе и сделать их статичными
  2. Переместить ваши sub0 и sub1 из класса. И передайте им указатель на свой класс (также известный как this ) в случае, если вам нужно получить доступ к другим переменным / функциям-членам в sub0 / sub1.
2
ответ дан 7 December 2019 в 07:40
поделиться