[C++] Klasy i zmienne statyczne +SFML

gabrysb1995
Użytkownik
Użytkownik
Posty: 96
Rejestracja: 12 mar 2011, o 14:27
Płeć: Mężczyzna
Lokalizacja: Przemyśl
Podziękował: 27 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: gabrysb1995 »

Mam następujący problem z kodem
Ukryta treść:    
, mniej więcej w nim chodzi o to, żeby pokazać zastosowanie algorytmu genetycznego na podstawie much, które próbują dolecieć do celu, omijając po drodze przeszkody, do zobrazowania tego użyłem SFML, lecz nie w tej bibliotece robi problem.

Jest funkcja zaprzyjaźniona czyKolizja która po prostu sprawdza czy mucha nie uderzyła w przeszkodę. Jest ona wywoływana przez metodę klasy Mucha, aktualizuj. Żeby tą funkcję wywołać z jednym z argumentów listaprzeszkód musiałem umieścić egzemplarz w klasie mucha. Jednak nie chcę, żeby każdy egzemplarz klasy mucha tworzył nowy identyczny egzemplarz klasy przeszkody, więc chciałem ten egzemplarz przeszkody w klasie mucha oznaczyć jaki static. Jednak wtedy wyskakują mi błędy, gdy chcę się odwołać do niego.

Dziękuję za jakąkolwiek pomoc, gdyż z tym problemem siedzę 2 dni i nie mam pomysłu jak go rozwiązać.

Edit. Jakby ktos znał lepsze rozwiązanie mojego problemu to też bym prosił o jakieś wskazówki:)
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: lukequaint »

Robisz składową static i inicjalizujesz poza klasą:

Kod: Zaznacz cały

przeszkody mucha::wszystkiePrzeszkody = przeszkody();
To dość powszechny problem, powinieneś poszukać trochę w Sieci - na pewno byś znalazł .

Ze wskazówkami jest tak, że w końcu za bardzo poprawiony przez kogoś kod umyka naszemu zrozumieniu . Kilka rzeczy można by tu usprawnić, np.:
  • utworzyć klasę Okno czy UkladWspolrzednych, która "zaopiekuje" się tymi wszystkimi zmiennymi globalnymi
  • unikałbym przyjaźni - po to mamy składowe prywatne, by nikt obcy ich nie dotykał; położenie można udostępnić publiczną metodą
  • wszystkiePrzeszkody lepiej byłoby przenieść do osobnej klasy (wtedy zmienna statyczna nie byłaby potrzebna) - żadna mucha nie przenosi ze sobą przeszkód
  • wydaje mi się, że rozsądniej byłoby utworzyć klasę abstrakcyjną Obiekt i sprawdzać kolizje między obiektami tej klasy (po niej dziedziczyłaby i klasa Mucha, i klasa Przeszkoda); nie chcę się mądrować, bo mało wiem na temat samych kolizji - poszukaj jakiegoś tutoriala, gdzie jest to zrobione dobrze
  • wyslijNtaPrzeszkode można by zamienić na przeciążony operator[]
.
gabrysb1995
Użytkownik
Użytkownik
Posty: 96
Rejestracja: 12 mar 2011, o 14:27
Płeć: Mężczyzna
Lokalizacja: Przemyśl
Podziękował: 27 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: gabrysb1995 »

Znowu mi ratujesz z ciężkiej sytuacji:) Dzięki wielkie.

Jest mi strasznie wstyd, że taka głupia drobnostka mi umknęła.

Co do zmiennych globalnych to są one chwilowe, służą mi do testowania kodu czy działa, potem się ich pozbędę(na pewno część )

Co do przyjaźni masz rację, mam niestety dziwny nawyk nadużywania przyjaźni.

Co do kolizji i klasy abstrakcyjnej to pomyślę, jak to zrobić, dzięki za sugestię.

Co do operatora[] fajna rzecz, kod będzie czytelniejszy
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: lukequaint »

Z kolizjami to wszystko zależy od tego, co będzie "latać". Jeśli będziesz mieć jeden (ewentualnie dla więcej niż jednego można zrobić jakąś klasę bazową dla klas mucha i przeszkoda jak wyżej, by uwzględniać też inne obiekty klasy mucha) obiekt klasy mucha, najrozsądniej chyba będzie dodać do tej klasy (zamiast zaprzyjaźniać funkcję z zewnątrz) metodę:

Kod: Zaznacz cały

bool czyKolizja(const przeszkoda& p);
która dla będzie sprawdzała, czy ten obiekt koliduje z podaną przeszkodą.

Korzystając z range-based for można by Twój kod w kilku miejscach uprościć, ale tym pewnie zajmiejsz się na końcu.

Powodzenia .
gabrysb1995
Użytkownik
Użytkownik
Posty: 96
Rejestracja: 12 mar 2011, o 14:27
Płeć: Mężczyzna
Lokalizacja: Przemyśl
Podziękował: 27 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: gabrysb1995 »

Dzięki za kolejne rady,nie wiem jak Ci się odwdzięczę, powinienem móc klikać za każdą Twoją odpowiedź z 5 razy pomógł nie wiem czy aż tak bym rozwijał ten programik, bo w sumie ma tylko demonstrować algorytm genetyczny, oczyszczę kod na pewno, ale chyba klasy bazowej dla much i przeszkód nie będę robił, choć przy kolejnym programem z SFLM na pewno zacznę od pisania klasy bazowej I o range-based for słyszałem, ale weszła ta pętla w C11 i odruchowo piszę zwykłego fora
Ukryta treść:    
Jestem już przy końcu działającej wersji, mam tylko problem z samą końcówka, więc jakbyś odpowiedział mi na parę pytań (lub ktoś inny byłbym niezmiernie wdzięczny)

Wiem, że jakość kodu nie poraża, Twoje rady jeszcze czekają na zastosowanie, ale bardzo chciałym zobaczyć działającą wersję, a potem oczyścić kod.

Tu dwa problemy które już sam rozwiązałem, więc nie warto czytać :
Ukryta treść:    
Mam też następujący problem, ale on tyczy się już SFLM, więc jeśli w nim nie siedziałeś, to nie chcę Ci zajmować czasu, bardziej liczę na osoby, które używały tej biblioteki (chyba, że też Łukasz używałeś go )poza funkcjami inicjować zmienne można tylko przy deklaracji/definicji.
Jednak mam taki problem, że chcę mieć globalną tablicę Vector2f, jednak przy probie inicjalizacji dostaje zwrotną informację od kompilatora, że nieudana konwersja z int do Vector2f, jak sobie z tym poradzić.

Kod: Zaznacz cały

const Vector2f prostokatPoczatek(400,400);
//const Vector2f prostokat[1]{(400,400)};   //???

Kolejny już edit
Ukryta treść:    
Tutaj jest działająca wersja, maluje najlepsze muchy na czerwono (w funkcji krzyżuj) i zauważyłem, że wcale nie te najlepsze muchy są malowane na czerwono, czyli funkcja sort nie sortuje, masz pomysł dlaczego? Z góry dziękuję
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: lukequaint »

Wcześniejszy problem:
  • wywołaj jawnie konstruktor

    Kod: Zaznacz cały

    const Vector2f prostokat[1]{Vector2f(400,400)};
    
  • albo użyj klamerek

    Kod: Zaznacz cały

    const Vector2f prostokat[1]{{400,400}};
    
Co do sortowania, wyświetl wyliczane oceny, to szybko zauważysz przyczynę problemu. Z tego, co widzę, wszystkie muchy od pewnego momentu mają ocenę \(\displaystyle{ 600}\) (nie zagłębiałem się w kod, może one gdzieś tam giną, ale i tak ocena przyjmuje tylko dwie wartości: \(\displaystyle{ 0}\) i \(\displaystyle{ 600}\), na tej podstawie nie można ich posortować).
gabrysb1995
Użytkownik
Użytkownik
Posty: 96
Rejestracja: 12 mar 2011, o 14:27
Płeć: Mężczyzna
Lokalizacja: Przemyśl
Podziękował: 27 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: gabrysb1995 »

Ukryta treść:    
Dzięki jeszcze raz, jawny konstruktor zadziałał, nie pomyślałem o tym, jeszcze dużo mi brakuje.

Mam ostatnie pytanie, bo już wszystko działa, poza jedną rzeczą, w pierwszej turze sortowanie nie działa. Gdy wypisuje ocenę w aktualizuj() to wszystko jest ok, ale jak po sortowaniu w main, to mam opóźnienie i najpierw same zera wypisuje, masz jakiś pomysł? Jeszcze raz dziękuję
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] Klasy i zmienne statyczne +SFML

Post autor: lukequaint »

Jeśli dobrze widzę, to dzieje się tak, bo w funkcji main() wypisujesz oceny, gdy

Kod: Zaznacz cały

licznik == rozmiarTablica + 199
a w funkcji aktualizuj() ustawiasz ocenę na \(\displaystyle{ !=0}\) i ją wypisujesz dopiero, gdy

Kod: Zaznacz cały

licznik == rozmiarTablica + 200
czyli o krok później.

Mogę Ci doradzić dwie rzeczy:
  • wypisuj wartości zmiennych w jednym miejscu lub pod spójnym warunkiem, np. określonym przez wynik jakiejś funkcji (mam na myśli if z wywołaniem funkcji zaraz przed wypisaniem wartości; możesz też przeanalizować program jakimś debuggerem i tam ładnie podejrzeć wartości poszczególnych zmiennych)
  • oznaczaj w jakiś specjalny sposób składowe klas, np. przedrostkiem m_, _ lub przyrostkiem _; dużo łatwiej czyta się wtedy kod - wiadomo, czy w danym miejscu zmieniamy wartość składowej jednego obiektu, drugiego, zmiennej lokalnej zdefiniowanej trzydzieści linijek wyżej czy zmiennej globalnej z innego pliku
ODPOWIEDZ