C++ OpenGL obsługa zdarzeń


(Szczalaala) #1

Witam,

od kilku dni zaczynam "zabawę" z OpenGLem :slight_smile: Na pierwszy rzut oka wszystko fajnie, gdyż chcemy obsłużyć klawę to wystarczy nam:

glutKeyboardFunc(funkcja);

i to działa :slight_smile:

 

Otwarłem nowy projekt i dzielę sobie wszystko na klasy i chciałem mieć w jednej klasie obsługę zdarzeńz klawiatury, ale to przestało działać :frowning:

Czytając na necie różne strony zauważyłem, że trzeba zrobić tą funkcję statyczną, ale w funkcji statycznej muszą być wszystkie zmienne statyczne :confused:

 

Ucząc się programować myślałem, że trzeba unikać statycznych zmiennych, gdyż tylko nam zaśmiecają pamieć, ale do sedna, gdyż gwałtownie mi rośnie liczba zmiennych statycznych.

 

  • Można to jakoś obejść żeby tam wrzucić normalną funkcję z innej klasy (nie statyczną)??

 

  • Czy można jakoś inaczej obsłużyć zdarzenia w OpenGLu??

 

  • Czy można to zmienić żeby docelowa przekazana funkcja mogła zwracać jakiś arument??

 

Poleca ktoś jakieś fajne rozwiązanie :slight_smile: ??


(kostek135) #2

Otworzyłem.

 

Bzdura, skąd ten pomysł w ogóle? Proszę o to przykład gdzie zmienna nie jest statyczna:

 

#include <iostream>
using namespace std;

class A {
	public:
		static void non_static_call() {
			int i = 1;
			
			i++;
			
			cout << i << endl;
		}
		
		static void static_call() {
			static int i = 1;
			
			i++;
			
			cout << i << endl;
		}
};

int main() {
	A::non_static_call();
	A::non_static_call();
	A::non_static_call();
	
	cout << endl;
	
	A::static_call();
	A::static_call();
	A::static_call();

	return 0;
}

Należy ich używać wszędzie tam, gdzie w wyniku analizy zagadnienia (i rozwiązania) doszliśmy do wniosku, że wymagane jest użycie zmiennej o zasięgu klasowym.

 

Nie zgodzę się. Taka zmienna po prostu istnieje, przez całe życie programu, ale jeśli jest zadeklarowana dynamicznie, to może zostać zwolniona.

 

To może wskazywać na wiele błędów popełnionych podczas projektowania aplikacji.

 

Możesz zdefiniować “normalną funkcję”? Chyba wszystkie konstrukcje języka C++ są uznawane za normalne. Najlepiej pokaż kawałek kodu, tego co chciałbyś zrobić, ale zwraca błąd.

 

Można zwrócić wynik przez referencję.

[edit]

Zmieniłem jeszcze przykładowy kod, abyś mógł zobaczyć różnicę, między zmienną statyczną metody statycznej i zmienną lokalną metody statycznej oraz to, że można je tak deklarować.