Callback-Funktion in Freeglut von Objekt

8

Ich benutze MSVC ++ und freeglut, um openGL zu verwenden. Jetzt habe ich eine Klasse namens Camera , die ziemlich einfach ist, aber sie enthält auch die Funktion für die Umformung meines Fensters.

Meine Frage ist: Wie kann ich glutReshapeFunc(void (*callback)(int,int)) auf meine Funktion in meiner Kamera einstellen?

Ich habe den folgenden Code, der wegen eines Compilerfehlers nicht funktioniert:

%Vor%

und meine Kamera-Klasse sieht in Camera.h wie folgt aus:

%Vor%

Vielleicht ist das nur eine allgemeine Callback-Frage, aber das einzige, was ich im Internet gefunden habe, war das Erstellen einer Wrapper-Klasse um den Callback herum. Aber es sieht nicht so aus, als sollte es so schwer sein. Danke im Voraus.

    
Marnix 15.02.2011, 19:02
quelle

4 Antworten

10

Es gibt keinen sauberen Weg, dies zu tun. C weiß nichts über Objekte, also funktionieren Zeiger zu Mitgliedern nicht. C macht keine Vorlagen, also funktionieren Funktoren nicht. Die API erlaubt es Ihnen nicht einmal, einen beliebigen void *userData an Ihren Callback zu übergeben, so dass Sie das Objekt auch nicht auf diese Weise weitergeben können.

In der Tat müssen Sie eine Wrapper-Funktion erstellen, die keine Member-Funktion ist, und Sie müssen ihr irgendwie über eine statische und / oder globale Variable Zugriff auf die Object-Instanz Camera geben.

Wenn mehrere Objekte auf dieses Ereignis warten können, können Sie eine Singleton-Klasse erstellen, mit der Sie beliebige Listener registrieren können.

    
Thomas 15.02.2011, 19:09
quelle
2

Sie können es nicht direkt verbinden. ReshapeCamera ist eine Member-Funktion, sie benötigt eine Kamera-Instanz, um ausgeführt werden zu können. Der Überladungsrückruf ist eine C-Funktion, die keine Instanz der Kamera hat, um Ihre Methode aufzurufen. Sie müssen eine Funktion erstellen, die die Kamera-Umformmethode aufruft.

    
fbafelipe 15.02.2011 19:08
quelle
1

Es hat nichts mit einer "C vs C ++" Sache zu tun. Sie müssen nur verstehen, was ein Element Funktionsaufruf beinhaltet und im Grunde, was es kompiliert.

%Vor%

Eine Elementfunktion ist eine detaillierte Beschreibung einer Funktion, die das Objekt einfach als ersten Parameter verwendet. Es ist nur in der aktuellen Parameterliste unsichtbar.

%Vor%

Von da an fügt C ++ spezielle Semantiken hinzu, um das Arbeiten in einer objektorientierten Weise zu erleichtern. Obwohl Ihr Objekt eine Elementfunktion des Formats void (int, int) hat, hat es tatsächlich das Format void (Camera *, int, int) und stimmt nicht mit dem gewünschten Format überein! Aus diesem Grund können statische Funktionselemente für solche Funktionszeiger verwendet werden. Schon mal bemerkt, dass statische Member-Funktionen nicht auf die Mitglieder von "this" zugreifen können? Das liegt daran, dass statische Elementfunktionen nicht eine Instanz des Objekts übergeben, das "this" repräsentiert.

Tatsächlich können Sie einen Großteil der objektorientierten Programmierung in C emulieren. Wenn Sie eine Reihe von Funktionen erstellen, die einen Struct-Zeiger als ersten Parameter verwenden, erhalten Sie viele der gleichen Vorteile!

    
TheBuzzSaw 15.02.2011 21:22
quelle
0

Im Folgenden wird gezeigt, wie Sie eine c-Callback-Funktion aus c ++ registrieren Es ist in der Regel nützlich, nicht spezifisch für Überangebot.

Hier ist Ihr Client-C ++ - Programm

%Vor%

}

Hier ist die Camera.cpp

%Vor%

und seine Kopfzeile Camera.h

%Vor%

Beachten Sie die Verwendung eines globalen C ++ - Klassenzeigers ptr_global_instance

    
Scott Stensland 04.08.2013 20:00
quelle

Tags und Links