Функция в качестве параметра для другой функции

Я реализую класс с именем FilesWorkFlow:

//this function is called by other functions of the class to set openGL data type
//based on GDAL data type
void FilesWorkFlow::setOpenGLDataType(void)
{
    switch (eType)
    {
    case GDT_Byte:
        type = GL_UNSIGNED_BYTE;
        break;
    case GDT_UInt16:
        type = GL_UNSIGNED_SHORT;
        break;
    case GDT_Int16:
        type = GL_SHORT;
        break;
    case GDT_UInt32:
        type = GL_UNSIGNED_INT;
        break;
    case GDT_Int32:
        type = GL_INT;
    }
}


//this function is called by other functions of the class to draw scene
void FilesWorkFlow::RenderScene(void)
{
    GLint iWidth = (GLint)RasterXSize;
    GLint iHeight = (GLint)RasterYSize;
    setOpenGLDataType();
    glClear(GL_COLOR_BUFFER_BIT);
    glRasterPos2i(0,0);
    glDrawPixels(iWidth,iHeight,format,type,pImage);
    glFlush();
}


//this function is called by other functions of the class to setup the 
//rendering state
void FilesWorkFlow::SetupRC(void)
{
    glClearColor(0.0f,0.0f,0.0f,1.0f);
}

void FilesWorkFlow::Show(void)
{
    int argc = 1;
    char **argv;
    argv[0] = "OPENGL";
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutCreateWindow("Image");
    glutDisplayFunc(RenderScene);
    SetupRC();
    glutMainLoop();
}  

Это часть класса, которая будет использоваться в приложении MFC для рендеринга, создания окна и рендеринга изображения TIFF, но в строке glutDisplayFunc(RenderScene) Я получаю ошибку

argument of type "void (FilesWorkFlow::*)()" is incompatible with parameter of type "void (__cdecl *)()"  

даже писать код как glutDisplayFunc((_cdecl)RenderScene) не помогло Как я могу исправить эту проблему и реализовать эту задачу в классе, который будет использоваться в приложениях MFC?

1 ответ

Во-первых, чтобы избавиться от этого заблуждения: GLUT не является частью OpenGL, и вам не нужно его использовать!

Вы не можете смешивать GLUT и MFC. И GLUT, и MFC делают примерно одно и то же:

  • Обеспечить платформу для создания Windows и иметь дело с пользовательским вводом
  • Управление основным циклом событий приложения

Вы не можете иметь две разные вещи в одной и той же программе, пытаясь сделать то же самое.


В любом случае, эта ошибка говорит вам следующее:

  • glutDisplayFunc ожидает простой указатель на функцию в качестве обратного вызова
  • То, что вы передаете glutDisplayFunc - это не указатель на функцию, а указатель на член класса, который сам по себе не имеет информации о том, к какому экземпляру класса он относится. Экземпляр должен быть передан в качестве дополнительного параметра или упакован с указателем члена - но glutDisplayFunc никогда не сможет с этим работать.

Или другими словами: то, что вы пытаетесь сделать, невозможно (без создания каких-либо оберток или использования грязных хаков).

Другие вопросы по тегам