Registriert: So Jan 23, 2005 13:21 Beiträge: 46 Wohnort: Vietnam
Hi!
Wollte mal das ganze OpenGL in Objekte / Klassen verpacken. Somit werden die Programme OO. Würde auch super funktionieren, wenn er nicht einen verdammten Fehler hätte. Ich poste mal den code, wo ich den Fehler hab. Ich hab auch im inet gesucht, aber nur 3Treffer gefundn, die nichts gebracht haben...
header:
Code:
class OpenGL
{
private:
virtual void display();
public:
virtual void run();
};
code:
Code:
#include "OpenGL.h"
#include "stdafxGL.h"
void OpenGL::display()
{}
void OpenGL::run()
{
glutDisplayFunc(display);
glutMainLoop();
}
Der Fehler ist bei glutDisplayFunc(display)...:
error C3867: 'OpenGL::display': function call missing argument list; use '&OpenGL::display' to create a pointer to member
Was ich schon probiert habe:
glutDisplayFunc(display()); -> error C2664: 'glutDisplayFunc' : cannot convert parameter 1 from 'void' to 'void (__cdecl *)(void)'
glutDisplayFunc(OpenGL::display); -> siehe glutDisplayFunc(display)
glutDisplayFunc(OpenGL::display()); -> siehe glutDisplayFunc(display());
glutDisplayFunc(&OpenGL::display); -> siehe glutDisplayFunc(display());
glutDisplayFunc(&OpenGL::display()); -> error C2102: '&' requires l-value
danke schonmal für eure Hilfe!
_________________ "As the enemy went to heaven,
we stayed in hell!"
Registriert: Di Sep 06, 2005 18:34 Beiträge: 362 Wohnort: Hamburg
Hi ...
um von einer Memberfunktion den Funktionspointer zu übergeben muss diese als static deklariert sein.
Gruß
Shai
_________________ Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)
Registriert: So Jan 23, 2005 13:21 Beiträge: 46 Wohnort: Vietnam
japp, dass es beim starten des Programms erstellt wird und nach beenden des Programmes abgebaut wird.
Also solange das Programm aktiv / offen is, gibt es diese methode...
Hmm, vielleicht kannst du mir gleich weiterhelfen...
Die methode is jetzt ja statisch. Jetzt will ich aber ein Objekt erstellen, welches erst dynamisch erstellt wird, geht das? Ich poste mal code:
Code:
class OpenGL
{
private:
Objects objects; //<-
static void display();
public:
virtual void run();
};
Code:
#include "OpenGL.h"
#include "stdafxGL.h"
void OpenGL::display()
{
objects.draw(); //<-
}
void OpenGL::run()
{
glutDisplayFunc(display);
glutMainLoop();
}
Man sieht, dass ich "Objects" dynamisch erzeuge, also wann das Object "OpenGL" erzeugt wird. Nachdem aber display statisch ist, gibs ja einen error, weil er das braucht. Was soll ich machn?
_________________ "As the enemy went to heaven,
we stayed in hell!"
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Generell ist es wohl etwas schwirig GLUT ordentlich in Objekte zu kapseln weshalb ich auch kein GLUT verwende :-).
Üblicherweise bsitzt du jedoch nur eine Instanz des OGL-Objektes, Ausnahmen gibts natürlich wenn du mehrere OGL-Fenster (zB für einen Editor) haben willst, was aber mit GLUT meines Wissens nach ohnehin etwas kompliziert sein dürfte (kenne mich aber mit GLUT nicht allzu gut aus). Wenn du also immer nur eine Instanz besitzt, dann könntest du einen "globalen" Pointer auf diese Instanz anlegen, was du beispielsweise so machen könntest:
Code:
.h:
class OpenGL
{
static OpenGL *m_pOGLInstance;
OpenGL();
...
};
.cpp:
OpenGL *OpenGL::m_pOGLInstance = NULL;
OpenGL::OpenGL()
{
m_pOGLInstance = this;
}
Generell würde ich an deiner Stelle jedoch eher C-Funktionen für die GLUT-Callbacks verwenden und dann von diesen eine Renderer-Klasse aufrufen, also etwa in der Art:
Code:
Renderer *G_pRenderer; //globale Variable
void Display()
{
G_pRenderer->Display();
}
Wenn du es in der Art machst hättest du nämlich auch keine Probleme mehrere Renderer zu verwenden (beispielsweise einen GUI-Renderer und einen 3D-Renderer) indem du einfach eine globale Liste von Renderern machst.
Vermutlich ist es sinnvoller, die entsprechenden glut Funktionalität selber in Klassen zu implementieren, weil man dann gleich von Begin an das ganze direkt auf Objekte auslegen kann.
In der VCL gibt es ein ähnliches Problem mit der Fensterprozedure. In der Unit classes gibt es die Methode MakeObjectInstance(Method:TWndMethod):Pointer die einen Methodenzeiger in einen einfachen Funktionszeiger konvertiert. Der Quelltext ist beim Turbo Delphi auch dabei.
japp, dass es beim starten des Programms erstellt wird und nach beenden des Programmes abgebaut wird. Also solange das Programm aktiv / offen is, gibt es diese methode...
Nein, was du schreibst, gilt für statische Objekte.
Wenn du eine Methode static machst, heist das, das du eine Klassenmethode hast, welche nicht mehr von einer Instanz abhängt. Du rufst diese Funktion dann also über den Klassennamen auf: OpenGL::display. Das hat natürlich zur Folge, dass es dort kein this gibt und somit auch keinen Zugriff auf Memberfunktionen und -variablen. Deswegen klappt dein Zugriff auf Objects nicht.
Demzufolge hat die statische Methode keinen Einfluss auf die dynamische Erstellung deiner Objekte.
@Lyrs: wenn du sowas machst, dann nutze bitte ein gescheites Singleton-Muster. Schaue mal was passiert, wenn du mehrere Objekte anlegst^^
Dann wird dein statischer Zeiger jedesmal neu beschrieben. Und wenn das Objket zerstört wird hast du einen ungültigen Zeiger, weil dieser Fall nicht behandelt wird.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.