Kleines Prob mit statischer Menber Fnkt und Glut
-
Hi Leute,
ich hab hier nen kleinen Glut code , wenn ich den Code aus der Klasse in die cpp mit der main schreibe Klapps, mit Klasse krieg ich aber Fehler, hier mal der Code und die Fehlermeldung :
code in der cpp:#include <windows.h> #include "cCube.h" static void Key(unsigned char key, int x, int y); static void SpecialKey(int key, int x, int y); cCube cube; int main(int argc, char **argv) { glutInit(&argc, argv); // Ausgabefenster definieren glutInitWindowPosition(0, 0); glutInitWindowSize( 400, 640); // Renderkontext mit Z-Buffer, Doublebuffer fuer RGB-Modus anfordern. glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE); if (glutCreateWindow("Sample1") == GL_FALSE) { exit(1); } cube.Init(); // Callback Funktionen vereinbaren // glutReshapeFunc(cube.Reshape); glutKeyboardFunc(Key); glutSpecialFunc(SpecialKey); glutDisplayFunc(cube.Display); // Kontrolle an GLUT Eventloop uebergeben glutMainLoop(); return 0; } static void Key(unsigned char key, int x, int y) { if (key==27) exit(1); if (key==' ') { if (cube.polygonMode==GL_FILL) cube.polygonMode=GL_LINE; else cube.polygonMode=GL_FILL; // Polygondarstellung zw. Outline und Gefuellt umschalten... glPolygonMode (GL_FRONT_AND_BACK, cube.polygonMode); // ... und Bild erneut rendern glutPostRedisplay (); } } static void SpecialKey(int key, int x, int y) { switch (key) { case GLUT_KEY_UP: cube.rotX -= 5; break; case GLUT_KEY_DOWN: cube.rotX += 5; break; case GLUT_KEY_LEFT: cube.rotZ -= 5; break; case GLUT_KEY_RIGHT :cube.rotZ += 5; break; default: return; } glutPostRedisplay(); }Code der cTest.h:
#include <GL/glut.h> class cCube { private: public: cCube(){} ~cCube(){} GLenum polygonMode; float rotX, rotY , rotZ; void Init(); static void DrawCube (); static void Display (); static void Reshape (int , int); }; void cCube::DrawCube () { glBegin(GL_QUADS); glColor3d(0.0 ,1.0 ,0.0); // GRÜN glVertex3d( 0.0 , 0.0, 0.0); // Oben rechts (OBEN) glVertex3d( 0.0 , 0.0, -1.0); // Oben links (OBEN) glVertex3d( 0.5 , 0.0, -1.0); // Unten links (OBEN) glVertex3d( 0.5 , 0.0, 0.0); // Unten rechts (OBEN) glColor3d(1.0 ,0.5 ,0.0 ); // ORANGE glVertex3d( 0.0 , -1.0 , 0.0 ); // Oben rechts (UNTEN) glVertex3d( 0.0 , -1.0 , -1.0 ); // Oben links (UNTEN) glVertex3d( 0.5 , -1.0 , -1.0 ); // Unten links (UNTEN) glVertex3d( 0.5 , -1.0 , 0.0 ); // Unten rechts (UNTEN) glColor3d(1.0 ,0.0 ,0.0 ); // ROT glVertex3d( 0.0 , 0.0 , 0.0 ); // Oben rechts (VORNE) glVertex3d( 0.5 , 0.0 , 0.0 ); // Oben links (VORNE) glVertex3d( 0.5 , -1.0 , 0.0 ); // Unten links (VORNE) glVertex3d( 0.0 , -1.0 , 0.0 ); // Unten rechts (VORNE) glColor3d(1.0 ,1.0 ,0.0 ); // GELB glVertex3d( 0.0 , 0.0 , -1.0 ); // Unten links (HINTEN) glVertex3d( 0.5 , 0.0 , -1.0 ); // Unten rechts (HINTEN) glVertex3d( 0.5 , -1.0 , -1.0 ); // Oben rechts (HINTEN) glVertex3d( 0.0 , -1.0 , -1.0 ); // Oben links (HINTEN) glColor3d(0.0 ,0.0 ,1.0 ); // BLAU glVertex3d( 0.0 , 0.0 , 0.0 ); // Oben rechts (LINKS) glVertex3d( 0.0 , 0.0 , -1.0 ); // Oben links (LINKS) glVertex3d( 0.0 , -1.0 , -1.0 ); // Unten links (LINKS) glVertex3d( 0.0 , -1.0 , 0.0 ); // Unten rechts (LINKS) glColor3d(1.0 ,0.0 ,1.0 ); // VIOLETT glVertex3d( 0.5 , 0.0 , 0.0 ); // Oben rechts (RECHTS) glVertex3d( 0.5 , 0.0 , -1.0 ); // Oben links (RECHTS) glVertex3d( 0.5 , -1.0 , -1.0 ); // Unten links (RECHTS) glVertex3d( 0.5 , -1.0 , 0.0 ); // Unten rechts (RECHTS) glEnd (); } void cCube::Init() { // Z-Buffer f. Berechnung verdeckter Flaechen einschalten glEnable(GL_DEPTH_TEST); // Vorder- u. Rueckseite der Polygone nur als Randlinien darstellen glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); } void cCube::Reshape(int width, int height) { // Darstellung auf gesamten Clientbereich des Fensters zulassen glViewport(0, 0, (GLint)width, (GLint)height); // Projektionsmatix initialisieren auf 60 Grad horizontales // Sichtfeld, Verhaeltnis Breite:Hoehe = 1:1, Clipping fuer z<1 // und z>200 */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); // angle, aspect, near Clip, far Clip */ gluPerspective(60.0, 1.0, 1.0, 200.0); // Modelview Matrix wieder zur aktuellen Matrix machen glMatrixMode(GL_MODELVIEW); } void cCube::Display(void) { // FrameBuffer unf Z-Buffer loeschen */ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Modelview Matrix initialisieren */ glLoadIdentity (); // Modeltransformation ausfuehren... glTranslatef (0.0, 0.0 ,-5.0); // Verschiebung um -3 in z-Richtung glRotatef (rotY, 0.0, 1.0, 0.0); // Rotation um die Y-Achse glRotatef (rotX, 1.0, 0.0, 0.0); // Rotation um die X-Achse glRotatef (rotZ, 0.0, 0.0, 1.0); // Rotation um die Z-Achse glTranslatef (-0.5, -0.5 , -0.5); // Verschieb. um -0.5, alle Richt. glScalef(1.0 , 1.0, 1.0); // ...und den Wuerfel unter der Modeltransformation zeichnen. DrawCube (); // Back-Buffer in den Front-Buffer kopieren. glutSwapBuffers(); }... und die Fehlermeldung:
Kompilierung läuft...
TestGlut1.cpp
d:\c++ prg. console 21\--------------- übungen ---------------\cube gfx\cube 2\ccube.h(107) : error C2597: Ungueltige Referenz auf ein Datenelement 'cCube::rotY' in einer statischen Member-Funktion
d:\c++ prg. console 21\--------------- übungen ---------------\cube gfx\cube 2\ccube.h(108) : error C2597: Ungueltige Referenz auf ein Datenelement 'cCube::rotX' in einer statischen Member-Funktion
d:\c++ prg. console 21\--------------- übungen ---------------\cube gfx\cube 2\ccube.h(109) : error C2597: Ungueltige Referenz auf ein Datenelement 'cCube::rotZ' in einer statischen Member-Funktion
Fehler beim Ausführen von cl.exe.Glut 1.exe - 3 Fehler, 0 Warnung(en)
Hoffe Ihr könnt mir helfen,
vielen Dank vorab ShadowEater
-
Du kannst in statischen Methoden keine Datenelemente referenzieren. f'`8k
AutocogitoGruß, TGGC (\-/ has leading)