Problem mit Klassen

CodeCrafterCpp

Erfahrenes Mitglied
Hallo,
Ich bin heute wieder angefangen mich mit den Thema Opengl und .obj laden.
Ich habe einen kleinen Code:
C++:
#include <iostream>
#include <windows.h>
#include <SDL.h> 
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#include<fstream>

using namespace std;

class Quad
{
public:
	float e1[3];
	float e2[3];
	float e3[3];
	float e4[3];

};

void auslesen(string Pfade)
{
	
		int i = 0;
        ifstream file(Pfade);
        string buffer;
		while(true)
		{
			getline(file,buffer);
			if(!buffer.find('v'))
			{
			cout << buffer << endl;
			}
			if(i<20)
			{
				i++;
			}else
			{
				break;
			}
		}
        file.close();
}

void init()
{
	glClearColor(0.0,0.0,0.0,1.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0,640.0/480.0,5.0,500.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}



void display()
{
	Quad s1;
	s1.e1[0] = 1.0000f;
	s1.e1[1] = -1.0000f;
	s1.e1[2] = -5.0f;

	s1.e2[0] = -1.0000f;
	s1.e2[1] = -1.0000f;
	s1.e2[2] = -5.0f;

	s1.e3[0] = -1.0000f;
	s1.e3[1] = 1.0000f;
	s1.e3[2] = -5.0f;

	s1.e4[0] = 1.0000f;
	s1.e4[1] = 1.0000f;
	s1.e4[2] = -5.0f;


	glClear(GL_COLOR_BUFFER_BIT);
	  glBegin(GL_QUADS);
        glVertex3f(s1.e1[0], s1.e1[1], s1.e1[2]);
		glVertex3f(s1.e2[0], s1.e2[1], s1.e2[2]);
		glVertex3f(s1.e3[0], s1.e3[1], s1.e3[2]);
		glVertex3f(s1.e4[0], s1.e4[1], s1.e4[2]);
		
        /*glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        
        glVertex3f(1.000000, 1.000000,-5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(1.000000, -1.000000,-5.0);
        
        glVertex3f(1.000000, -1.000000,-5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,-5.0);
        
        glVertex3f(-1.000000, -1.000000,-5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,-5.0);
        
        glVertex3f(-1.000000, 1.000000,-5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,-5.0);*/
	glEnd();
}

int main(int, char**)
{
	auslesen("C://Users/Jonas/Desktop/test.obj");
	SDL_Init(SDL_INIT_EVERYTHING);
	SDL_Surface* screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_OPENGL);
	bool running=true;
	Uint32 start;
	SDL_Event event;
	init();
	while(running)
	{
		start=SDL_GetTicks();
		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
				case SDL_QUIT:
					running=false;
					break;
			}
		}
		display();
		SDL_GL_SwapBuffers();
		if(1000/30>(SDL_GetTicks()-start))
			SDL_Delay(1000/30-(SDL_GetTicks()-start));
	}
	SDL_Quit();
	return 0;
}

Jetzt möchte ich aber das dieser Teil in einer Funktion steht:
C++:
	Quad s1;
	s1.e1[0] = 1.0000f;
	s1.e1[1] = -1.0000f;
	s1.e1[2] = -5.0f;

	s1.e2[0] = -1.0000f;
	s1.e2[1] = -1.0000f;
	s1.e2[2] = -5.0f;

	s1.e3[0] = -1.0000f;
	s1.e3[1] = 1.0000f;
	s1.e3[2] = -5.0f;

	s1.e4[0] = 1.0000f;
	s1.e4[1] = 1.0000f;
	s1.e4[2] = -5.0f;

Aber dabei bekomme ich nur Fehler muss ich da auch was zurück geben? Und ich habe gesehen das andere es mit Struct oder so machen....aber ich den Tutorial über C++ stand das es eigentlich C ist und das lieber class nutzen soll weil das besser oder so ist...stimmt das?


mfG
 
Zuletzt bearbeitet von einem Moderator:
1.
Fehler
Code:
Fehler	20	error C2228: Links von ".e4" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	86
Fehler	22	error C2228: Links von ".e4" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	86
Fehler	24	error C2228: Links von ".e4" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	86
Fehler	14	error C2228: Links von ".e3" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	85
Fehler	16	error C2228: Links von ".e3" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	85
Fehler	18	error C2228: Links von ".e3" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	85
Fehler	8	error C2228: Links von ".e2" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	84
Fehler	10	error C2228: Links von ".e2" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	84
Fehler	12	error C2228: Links von ".e2" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	84
Fehler	2	error C2228: Links von ".e1" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	83
Fehler	4	error C2228: Links von ".e1" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	83
Fehler	6	error C2228: Links von ".e1" muss sich eine Klasse/Struktur/Union befinden.	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	83
Fehler	1	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	83
Fehler	3	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	83
Fehler	5	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	83
Fehler	7	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	84
Fehler	9	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	84
Fehler	11	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	84
Fehler	13	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	85
Fehler	15	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	85
Fehler	17	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	85
Fehler	19	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	86
Fehler	21	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	86
Fehler	23	error C2065: 's1': nichtdeklarierter Bezeichner	c:\users\jonas\documents\visual studio 2010\projects\openglobjetztloader\openglobjetztloader\main.cpp	86

Und einer meiner Versuche:
C++:
#include <iostream>
#include <windows.h>
#include <SDL.h> 
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#include<fstream>

using namespace std;

class Quad
{
public:
	float e1[3];
	float e2[3];
	float e3[3];
	float e4[3];

};

void auslesen(string Pfade)
{
	
		int i = 0;
        ifstream file(Pfade);
        string buffer;
		while(true)
		{
			getline(file,buffer);
			if(!buffer.find('v'))
			{
			cout << buffer << endl;
			}
			if(i<20)
			{
				i++;
			}else
			{
				break;
			}
		}
        file.close();
}

void init()
{
	glClearColor(0.0,0.0,0.0,1.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0,640.0/480.0,5.0,500.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

Quad bennenen()
{
	Quad s1;
	s1.e1[0] = 1.0000f;
	s1.e1[1] = -1.0000f;
	s1.e1[2] = -5.0f;

	s1.e2[0] = -1.0000f;
	s1.e2[1] = -1.0000f;
	s1.e2[2] = -5.0f;

	s1.e3[0] = -1.0000f;
	s1.e3[1] = 1.0000f;
	s1.e3[2] = -5.0f;

	s1.e4[0] = 1.0000f;
	s1.e4[1] = 1.0000f;
	s1.e4[2] = -5.0f;

	return s1;
}

void display()
{

	bennenen();
	glClear(GL_COLOR_BUFFER_BIT);
	  glBegin(GL_QUADS);
        glVertex3f(s1.e1[0], s1.e1[1], s1.e1[2]);
		glVertex3f(s1.e2[0], s1.e2[1], s1.e2[2]);
		glVertex3f(s1.e3[0], s1.e3[1], s1.e3[2]);
		glVertex3f(s1.e4[0], s1.e4[1], s1.e4[2]);
		
        /*glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        
        glVertex3f(1.000000, 1.000000,-5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(1.000000, -1.000000,-5.0);
        
        glVertex3f(1.000000, -1.000000,-5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,-5.0);
        
        glVertex3f(-1.000000, -1.000000,-5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,-5.0);
        
        glVertex3f(-1.000000, 1.000000,-5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,-5.0);*/
	glEnd();
}

int main(int, char**)
{
	auslesen("C://Users/Jonas/Desktop/test.obj");
	SDL_Init(SDL_INIT_EVERYTHING);
	SDL_Surface* screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_OPENGL);
	bool running=true;
	Uint32 start;
	SDL_Event event;
	init();
	while(running)
	{
		start=SDL_GetTicks();
		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
				case SDL_QUIT:
					running=false;
					break;
			}
		}
		display();
		SDL_GL_SwapBuffers();
		if(1000/30>(SDL_GetTicks()-start))
			SDL_Delay(1000/30-(SDL_GetTicks()-start));
	}
	SDL_Quit();
	return 0;
}


2.
Damit ist gemeint ob ich lieber Struct oder Class nehmen soll. Ich habe bei anderen die obj loader geschrieben habe gesehen das die oft struct nehmen aber in einen Tutorial über C++ stand das Struct von C stamm und halt Class das verbesserte ist....


mfG
 
Zuletzt bearbeitet von einem Moderator:
Zu struct/class: Das Tutorial ist Unsinn.
In C++ gibt es zwischen struct/class nur einen einzigen Unterschied:
Wenn man public/private nicht selber dazuschreibt, ist es bei struct public, bei class private.

Da ist nichts besser oder schlechter.

Fehler:
Variablen aus bennenen (eigentlich zuerst ein, dann zwei n: benennen)
werden nicht automatisch in andere Funktionen mitübernommen.
Mach es zB. so:
C++:
void bennenen(class Quad *s1)
{
    s1->e1[0] = 1.0000f;
    s1->e1[1] = -1.0000f;
    s1->e1[2] = -5.0f;
 
    s1->e2[0] = -1.0000f;
    s1->e2[1] = -1.0000f;
    s1->e2[2] = -5.0f;
 
    s1->e3[0] = -1.0000f;
    s1->e3[1] = 1.0000f;
    s1->e3[2] = -5.0f;
 
    s1->e4[0] = 1.0000f;
    s1->e4[1] = 1.0000f;
    s1->e4[2] = -5.0f;

}
 
void display()
{
    Quad s1;
    bennenen(&s1);
...
Man könnte auch eine Kopie zurückgeben, aber so ists schneller
(obwohl der winzige Unterschied egal sein wird)...
 
Zurück