Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Modyfikowanie atrybutów obiektu

Ostatnio zmodyfikowano 2015-10-12 18:05
Autor Wiadomość
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:

C/C++
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.
P-138445
darko202
» 2015-10-12 10:23:33
chodzi Ci o polimorfizm
np. http://guidecpp.cal.pl​/cplus,polimorph
wtedy można to o czym piszesz zrealizować.
 
P-138468
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

C/C++
// tu jest funkcja pop (pobierz ze stosu)

//jeśli stos osiągnął dół to wysyła sygnał pusty!!!
if( stackCount == 0 ) emit stackEmpty( true );



[....]

connect( m_stack, SIGNAL( stackEmpty( bool ) ), ui->popButton, SLOT( setDisabled( bool ) ) );
// połącz obiekt stosu sygnał "stos pusty" z obiektem przycisku slotem dezaktywuj.
//łączyć można dowolnie

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 !!!

P-138470
emSon
Temat założony przez niniejszego użytkownika
» 2015-10-12 18:05:29
C/C++
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!
P-138479
« 1 »
  Strona 1 z 1