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

    Autocogito

    Gruß, TGGC (\-/ has leading)


Anmelden zum Antworten