Мне должно было успешно наконец удаться использовать заголовок 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, кодируют и избавляются от той ошибки?
спасибо
Объекты класса C ++ имеют указатель this, который невидимо передается в качестве первого аргумента функции-члену класса. Это означает, что вы не можете использовать нестатическую функцию-член для указателя функции в стиле C, который принимает 0 аргументов.
Итак, решите это, у вас есть несколько вариантов. Мне нужно больше подробностей, прежде чем я расскажу, какой из них выбрать.
Используйте boost или tr1 или какую-либо другую библиотеку C ++, которая позволяет связывать функции-члены с их указателем this. С boost это будет выглядеть так:
{"Пользователи", boost :: bind (& MainView :: sub0, this), "Управление пользователями"},
Вы можете изменить свой код, чтобы передавать ссылку на объект класса вместе с указателями на функции. В таком случае вы можете вызывать обратные вызовы непосредственно для нужного объекта. Однако похоже, что вы имеете дело с оконным менеджером, и поэтому вы, вероятно, не сможете внести изменения, необходимые для работы этого подхода.
Я не думаю, что можно передать нестатическую функцию-член как указатель FUNC. Поскольку компилятор передаст указатель this всем нестатическим функциям-членам.
У вас есть 2 варианта: