gpt4 book ai didi

c++ - GLUT 中使用的全局类不好吗?如果是这样,如何避免这种情况?

转载 作者:行者123 更新时间:2023-11-30 04:35:25 25 4
gpt4 key购买 nike

我利用 GLUT 函数使用 Open GL 编写了这个简单的程序。为了操纵立方体,我使用 glutKeyboardFunc() 来操纵相机或使用变量的角度,此时调用 glutIdleFunc() 来重绘场景。我能够在我的 rend 函数和我的 keycheck 函数之间取得联系的唯一方法是创建一个全局类,其中包含我的变量和两个函数。

这是与我的问题直接相关的代码。

enter code here

#include "stdafx.h"
#include "OGL.h"


void boingdraw();
void boingkeys();

OGL Tramp; //Global class
void boingdraw() // called by glutDisplayFunc and kicks to my draw function
{
Tramp.rend();
}
void boingkeys(unsigned char key, int x, int y) //called by glutKeyboardFunc
//kicks to my key switch
{
Tramp.Keycheck( key,x, y);
}




int main (int argc, char**argv)
{





glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutCreateWindow("Testing");
render3d();
glutDisplayFunc(boingdraw);
glutKeyboardFunc(boingkeys);
glutIdleFunc(boingdraw);
glutReshapeFunc(resize);
glutMainLoop();
}

OGL.h 文件只有我的包含和初始化 OGL 类的 2 个函数。这是 OGL.cpp 文件

enter code here 
#include "stdafx.h"
#include "OGL.h"


OGL::OGL()
{
lx= 0.0;
updown= 0.0;
z= -5.0;
v1=0.0;
v2=1.0;
v3=0.0;
}
void OGL::rend()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// camera perspective variables used to move camera
//with keyfunc
gluLookAt(0.0,updown,z,
lx,0.0,0.0,
v1,v2,v3);





glPushMatrix();
glTranslatef(-0.0,-0.0,0.0);
//angle if changed in keycheck func called by glutKeyboardFunc()
glRotatef(angle,0.0,1.0,0.0);


glBegin(GL_QUADS);

//draws stuff not important really



glEnd();
glPopMatrix();
glutSwapBuffers();

}
void OGL::Keycheck(unsigned char key, int x, int y)
//Key switchboard with various checks for wsadqe and esc keys

{
switch (key)
{
case 27:
{
exit(0);break;
}
case 97:
{
lx=lx+0.25;

break;
}
case 100:
{
{
lx=lx-0.25;

break;
}
}
case 101:
{

angle += 2.0f;
if(angle > 360) angle -= 360;

break;

}
case 113:
{

angle -= 2.0f;
if(angle < 0) angle += 362;

break;
}
case 115:
{
z=z-0.25;

break;
}
case 119:
{
z=z+0.25;


}


}
}

我已经尝试了很多 trampolines 和函数指针的实现,试图进入我的类并在 main 中初始化它,但我永远无法让它编译而不会出错。使用过剩时全局类是否被认为是坏的?如果可以,有人可以提供一些可用于我的代码来解决此问题的技术示例吗?

请不要将此视为“为我做作业”线程或任何我只要求使用我的代码的示例,因为它会帮助我更好地理解这些技术的实现。

提前谢谢你,请原谅糟糕的代码(如果是的话)我只是在学习,不想养成坏习惯。

最佳答案

我认为您正在尝试协调“全局变量总是邪恶的”并且不得不在 GLUT 中使用非 OO 回调。

简短回答 - 您必须使用某种全局变量是正确的。

所以为了好的程序设计,回过头来考虑全局变量的问题。您的代码“按原样”很好,因为全局在一个文件中。将其明确标记为文件范围会更好:

static OGL  Tramp; // Or use a local namespace.

这意味着它在某种程度上是封装的,但可以从您的回调中访问。您可以使用 Singleton 遵循几​​乎相同的模式。如果您确定只需要一个 OGL 实例,那么这很好。如果您可能需要其他实例,可以将其包装在函数调用中(可能是静态类方法):

OGL&  getOGLInstance(unsigned id = 0)
{
static OGL Tramp; // Or use a local namespace.
// Later, add in handling to find the instance given 'id'.
return Tramp;
}

关于c++ - GLUT 中使用的全局类不好吗?如果是这样,如何避免这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5307789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com