[C++/SFML] Problem z tworzeniem okna pochodzącego z innej klasy


(MrGalek) #1

Witam
Mam pewien problem chcę zrobić aplikacje która ma dwie możlwiości (albo wyświetlana tekstowo albo graficznie własnie w SFML}. Niestety kiedy tworzę okienko w innej klasie i chcę aby była ona obiektem z maina to blokuje mnie ten błąd. Przejrzałem Stacka i wszystkie metody tam opisane nie dały skutku (albo nie ogarnąłem co zrobic).
Dodam że jak dam samą deklaracje obiektu wdok a potem dodam jaka metoda która generuje okienko to owszem działa ale zawiesza się…
Dokładnie o co mi chodzi zobaczycie w screenie :slight_smile:Z góry dzięki :slight_smile:


(Fizyda) #2

Pierwszy błąd jaki widzę:
w pliku main.cpp masz:
wdok w = wdok(blabla);

to raczej nie jest poprawne prawda? Albo używasz wskaźnika i tworzysz obiekt dynamicznie:
wdok * w = new wdok(blabla);
albo tworzysz go poprawnie:
wdok w(blabla);

Zresztą w błędzie logach kompilacji masz błąd wypisany jak byk, nie ma funkcji wdok() bo na to wskazuje obecny zapis - na użycie funkcji.


(MrGalek) #3

o kurde racja :o. Nie wiem czemu się uparłem na to new…Już któryś raz się na tym łapie że tak tworze obiekty w C++…
Dzięki ogromne :wink:


(Fizyda) #4

W innych jeżykach wygląda to inaczej, domyślnie używasz w innych językach wskaźników dynamicznych. One są obsługiwane w sposób zautomatyzowany i obiekty tworzone dynamiczne są kasowane w momencie gdy żaden wskaźnik na nie nie wskazuje.

W np Javie zapis:
SomeClass obj = new SomeClass(1, 2.0);
jest równoznaczny (prawie bo to jest pod maską w Javie) do zapisu w C++:
SomeClass * obj = new SomeClass(1, 2.0);

Różnica jest taka że gdy zrobisz taką operację:
obj = null;
W Javie obiekt zostanie usunięty z pamięci gdy będzie ona oczyszczana, natomiast w C++ obiekt dalej będzie zajmował pamięć, ale utracisz do niego wskaźnik i już nigdy (w łatwy sposób nie stosując różnych trików) nie uzyskasz do niego dostępu, zostanie on usunięty dopiero w momencie zakończenia głównego procesu - zamknięcia programu. Taka sytuacja to memory leak czyli wyciek pamięci, jeśli np. będziesz takie coś robił w pętli to program może zarezerwować całą dostępną pamięć i przestać działać lub zawiesić cały system.
Dlatego w C++ musisz zrobić najpierw usunąć obiekt z pamięci przy użyciu delete:

Gdy w C++ stosujesz zapis:
SomeClass obj(1, 2.0);
obiekt zostanie usunięty automatycznie gdy przestanie istnieć kontekst w którym został utworzony. Kontekstem będzie funkcja, pętla czy klasa. Ma to związek z dostępnością/widocznością czy też zasięgiem zmiennych.