Nic*_*nar 27 c++ opengl compiler-errors class
我已经创建了一个C++类(myPixmap)来封装OpenGL GLUT工具包执行的工作.display()该类的成员函数包含设置GLUT所需的大部分代码.
void myPixmap::display()
{
// open an OpenGL window if it hasn't already been opened
if (!openedWindow)
{
// command-line arguments to appease glut
char *argv[] = {"myPixmap"};
int argc = 1;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition(30, 30);
glutCreateWindow("Experiment");
glutDisplayFunc(draw);
glClearColor(0.9f, 0.9f, 0.9f, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glutMainLoop();
openedWindow = true;
}
}
Run Code Online (Sandbox Code Playgroud)
传递给的显示函数glutDisplayFunc()是该类的另一个成员函数:
void myPixmap::draw(void)
{
glDrawPixels( m,n,GL_RGB,GL_UNSIGNED_BYTE, pixel );
}
Run Code Online (Sandbox Code Playgroud)
但是,Mac OS X 10.6.4上的gcc 4.2.1拒绝编译此代码,声称:
argument of type 'void (myPixmap::)()' does not match 'void (*)()'
有没有办法在类的成员函数中使用GLUT工具包,还是必须main在程序函数中调用所有GLUT函数?
Mer*_*ham 33
问题是指向实例绑定成员函数的this指针必须包含指针.OpenGL是一个C API,对this指针一无所知.您将不得不使用静态成员函数(不需要实例,因此不需要this),并设置一些静态数据成员(以访问实例)以便使用glutDisplayFunc.
class myPixmap
{
private:
static myPixmap* currentInstance;
static void drawCallback()
{
currentInstance->draw();
}
void setupDrawCallback()
{
currentInstance = this;
::glutDisplayFunc(myPixmap::drawCallback);
}
};
Run Code Online (Sandbox Code Playgroud)
您可能也遇到C链接与C++链接的问题,在这种情况下您将不得不玩extern "C".如果是这样,您可能必须使用全局函数,而不是静态成员函数作为回调,并具有该调用myPixmap::draw.就像是:
class myPixmap
{
public:
void draw();
private:
void setupDrawCallback();
};
myPixmap* g_CurrentInstance;
extern "C"
void drawCallback()
{
g_CurrentInstance->draw();
}
void myPixmap::setupDrawCallback();
{
::g_CurrentInstance = this;
::glutDisplayFunc(::drawCallback);
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,尝试尽可能少地进行更改,因为这对于将OpenGL作为C API进行处理真的很糟糕.
如果你想要多个实例(我不认为大多数人使用GLUT创建多个实例,但也许你是),你将不得不找出一个使用std :: map来检索实例的解决方案:
static std::map<int, myPixmap> instanceMap;
Run Code Online (Sandbox Code Playgroud)
在哪里你int可以解决哪个实例,我不确定:)
仅供参考,您应该以这种方式定义不带参数的函数:
void some_function() { }
Run Code Online (Sandbox Code Playgroud)
不
void some_function(void) { }
Run Code Online (Sandbox Code Playgroud)