Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 21:23

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Sep 22, 2006 13:24 
Offline
DGL Member

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:
  1. class OpenGL
  2. {
  3. private:
  4.  
  5.     virtual void display();
  6.  
  7. public:
  8.  
  9.     virtual void run();
  10.  
  11. };


code:
Code:
  1. #include "OpenGL.h"
  2. #include "stdafxGL.h"
  3.  
  4. void OpenGL::display()
  5. {}
  6.  
  7. void OpenGL::run()
  8. {
  9.     glutDisplayFunc(display);
  10.  
  11.     glutMainLoop();
  12. }


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!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 22, 2006 13:38 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: re
BeitragVerfasst: Fr Sep 22, 2006 14:11 
Offline
DGL Member

Registriert: So Jan 23, 2005 13:21
Beiträge: 46
Wohnort: Vietnam
super, danke!
funktioniert einwandfrei (naja, er compiled mal, der rest is aber machbar!) ;)

_________________
"As the enemy went to heaven,
we stayed in hell!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: re
BeitragVerfasst: Fr Sep 22, 2006 14:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
ISAS hat geschrieben:
super, danke!
funktioniert einwandfrei (naja, er compiled mal, der rest is aber machbar!) ;)


Du weist auch, was das static bedeutet?

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 22, 2006 14:41 
Offline
DGL Member

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:
  1.  
  2. class OpenGL
  3. {
  4.  
  5. private:
  6.     Objects objects;           //<-
  7.     static void display();
  8.  
  9. public:
  10.     virtual void run();
  11.  
  12. };


Code:
  1. #include "OpenGL.h"
  2. #include "stdafxGL.h"
  3.  
  4. void OpenGL::display()
  5. {
  6.     objects.draw();        //<-
  7.  
  8. }
  9.  
  10. void OpenGL::run()
  11. {
  12.     glutDisplayFunc(display);
  13.  
  14.     glutMainLoop();
  15. }


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!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 22, 2006 17:33 
Offline
DGL Member

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:
  1. .h:
  2. class OpenGL
  3. {
  4.    static OpenGL *m_pOGLInstance;
  5.    OpenGL();
  6.  
  7.    ...
  8. };
  9.  
  10. .cpp:
  11. OpenGL *OpenGL::m_pOGLInstance = NULL;
  12.  
  13. OpenGL::OpenGL()
  14. {
  15.   m_pOGLInstance = this;
  16. }


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:
  1. Renderer *G_pRenderer; //globale Variable
  2.  
  3. void Display()
  4. {
  5.   G_pRenderer->Display();
  6. }


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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 22, 2006 20:07 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 23, 2006 09:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
ISAS hat geschrieben:
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]