[C++] Modyfikowanie atrybutów obiektu
Ostatnio zmodyfikowano 2015-10-12 18:05
emSon Temat założony przez niniejszego użytkownika |
[C++] Modyfikowanie atrybutów obiektu » 2015-10-11 19:59:13 Cześć znowu! Mam klasę Pole i funkcję strzał(). Funkcja jest przyjacielem klasy i dostała już oryginały jej obiektów. Na polach są rozmieszczone statki. Jest czteromasztowiec, trójmasztowiec i dwumasztowiec. Każdy z nich wywodzi się z abstrakcyjnej klasy Statek. Użytkownik przy strzałach nie wie czy zatopił już statek, czy może gdzieś jeszcze jego ogon tam spoczywa. Ja, dobroduszny władca światu statków chce go o tym poinformować. Statki mają atrybuty bool, które informują, czy jakaś jego część jeszcze jest na morzu, czy już gryzie glebę z Titanicem. Jest też metoda wirtualna sprawdź(). Mówi ona, że jeśli każda część statku jest na dnie, to jest on zatopiony i wyświetla stosowny komunikat. Jakaż nieszczęsna ma dola, jam, statek o ID 4, który był dzielnym dwumasztowcem spocząłem na dnie. Bądź przeklęty!I do tej pory wszystko gra. Teraz czas na pytanie.. Jak wywołać tą funkcję dla konkretnego statku?Pola mają namiary do statku. To jest ID. Jako że zawsze będzie tylko 6 statków to pomyślałem, że może dobrze byłoby zrobić tak: switch( ID ) { case 1: statek1.sprawdz(); case 2: statek2.sprawdz(); case 3: statek3.sprawdz(); case 4: statek4.sprawdz(); case 5: statek5.sprawdz(); case 6: statek6.sprawdz(); }
Jednak czekałoby mnie jeszcze przypisanie true w razie gdyby pole, w które strzelił użytkownik było zajęte przez jakiś stateczek, a to wiązałoby się z kolejnym switchem. Nie da się zapisać tego jakoś inaczej? Wiem, że z tablicami było by szybciej, ale chyba nie da się do tablicy wpisać obiektów różnych klas. |
|
darko202 |
» 2015-10-12 10:23:33 |
|
mateczek |
» 2015-10-12 11:03:18 poczytaj o mechanizmie sygnałów i slotów!!! ja tutaj pobawiłem się z QT https://pl.wikibooks.org/wiki/Programowanie_C%2B%2B_Qt4_w_systemie_Gnu-Linux/Sygna%C5%82y_i_Sloty%2B%2B Jest to program prostego stosu na napisy. Gdy Stos się opróżni wysyła sygnał!!! mechanizm opiera się na dwóch linijkach kodu
if( stackCount == 0 ) emit stackEmpty( true );
[....]
connect( m_stack, SIGNAL( stackEmpty( bool ) ), ui->popButton, SLOT( setDisabled( bool ) ) );
Napisałem tą klasę do obsługi przycisku "wstecz" w prostej przeglądarce plików. Idea jest taka, że jak stos osiągnie dno przycisk się z automatu dezaktywuje bez jakiejkolwiek ingerencji programowej. wiem, że boost ma też taki mechanizm jeśli komuś QT nie leży to może boost !!! |
|
emSon Temat założony przez niniejszego użytkownika |
» 2015-10-12 18:05:29 class Pole { int adres; int wspol; bool zajete; ... public: ... friend class Czteromasztowiec; ... };
class Statek { protected: int id; bool zatopiony; public: virtual void ustaw( Pole x[] ) = 0; };
class Czteromasztowiec : public Statek { int wspol1; ... bool trafiony1; ... public: Czteromasztowiec( int ); virtual void ustaw( Pole x[] ); };
class Trojmasztowiec : public Statek { ... };
class Dwumasztowiec : public Statek { ... };
Skrócone klasy. Jak widać, polimorfizm już jest zastosowany. Jednak już sam znalazłem rozwiązanie problemu, a był on w myśleniu. Zamiast podsyłać do funkcji wszystkie sześc statków prześle jej zmienne 'a' i 'b', które oznaczą ID statku i konkretną jego współrzędną. W switchu sprawdzę który statek przypisać do wskaźnika polimorficznego i wtedy odpalę metodę wirtualną, która przypisze wartości true atrybutom trafiony, a następnie sprawdzić czy jest już zatopiony. Może pisze niezrozumiale dla tych, którzy nie mają kodu przed nosem - jak ja - ,ale w skrócie chodzi o to, że sam doszłem do rozwiązania. Dzięki! |
|
« 1 » |