Указатель на член является недопустимым или как передать имя функции в другую функцию. Переход с С на С++
возник вопрос в С можно было делать так:
//объявления
UG_S16 UG_Init( UG_GUI* g, void (*p)(UG_S16,UG_S16,UG_COLOR), UG_S16 x, UG_S16 y );
UG_GUI GUI_1;
void UserSetPixel(UG_S16 x, UG_S16 y, UG_COLOR c)
{
SetPixel(x, y, c);
}
// часть кода исполняемой функции в которую передаётся внешняя функция
UG_S16 UG_Init( UG_GUI* g, void (*p)(UG_S16,UG_S16,UG_COLOR), UG_S16 x, UG_S16 y )
{
UG_U8 i;
g->pset = (void(*)(UG_S16,UG_S16,UG_COLOR))p;
//..... }
//вызов в программе
UG_Init(&GUI_1, UserSetPixel , 320, 240);
попытка повторить в С++ не увенчалась успехом :( я недавно начал переходить с С на С++ вот код в с++:
private: void* UserSetPixel(UG_S16 x, UG_S16 y, UG_COLOR c) {
myBitmap->SetPixel(x, y, Color::FromArgb(c));
}
private: System::Void создатьНовуюGUIToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
//создание головного пункта
if (treeView1->SelectedNode->Index == 0) {
in++;
treeView1->SelectedNode->Nodes->Add("GUI", "GUI",in);
treeView1->ContextMenuStrip = this->contextMenuStrip2;
treeView1->SelectedNode->ContextMenuStrip;
UG_GUI GUI_1;
UG_Init(&GUI_1, UserSetPixel , 320, 240);
}
}
Ошибка ссылается на UserSetPixel
в строке UG_Init(&GUI_1, UserSetPixel , 320, 240);
смотрел тут https://learn.microsoft.com/ru-ru/cpp/cpp/pointers-to-members?view=msvc-170 но так и не смог разобраться...
Ответы (1 шт):
Автор решения: Vladimir Netu
→ Ссылка
Решение: замена void*
на int*
, так как определение void*
- это указатель на несуществующий связанный с ним тип данных.
//объявления
UG_S16 UG_Init(UG_GUI* g, int(*p)(UG_S16, UG_S16, UG_COLOR), UG_S16 x, UG_S16 y);
int UserSetPixel(UG_S16 x, UG_S16 y, UG_COLOR c)
{
this->myBitmap->SetPixel(x, y, Color::FromArgb(c));
}
// функция вызова
UG_S16 UG_Init( UG_GUI* g, int(*p)(UG_S16,UG_S16,UG_COLOR), UG_S16 x, UG_S16 y )
{
UG_U8 i;
g->pset = p(UG_S16,UG_S16,UG_COLOR); //(int(*)(UG_S16, UG_S16, UG_COLOR))p
//.......
}
//вызов функции
UG_GUI GUI_1;
UG_Init(&GUI_1, UserSetPixel , 320, 240);
помощь оказала вот эта статья.
Всем спасибо за помощь и направление в нужную сторону.