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

Wskaźniki wskazują na jeden obiekt mimo że przypisuje je do dwóch oddzielnych

Ostatnio zmodyfikowano 2019-02-05 18:33
Autor Wiadomość
pekfos
» 2019-02-01 20:35:58
Nie rozumiem co Cię przed tym powstrzymuje. Możesz tworzyć obiekt w dowolnym momencie.
P-173833
ziajek444
» 2019-02-05 18:33:31
Kolego, Pan pekfos juz w pierwszym poście Ci dobrze poradził. Spróbuję jednak trochę rozwiać niepewność.

// 1. Tworzysz dwa wskaźniki na klasę Postać (postac1 i postac2). To znaczy że w każdej nie statycznej i nie const klasie możesz użyć operatorów new i delete. Są jednak pewne warunki:

- Wszyscy Magowie, Palladyni, Berserkowie, Łotry i Zbóje muszą dziedziczyć po klasie Postac.
- Nie możesz usunąć obiektu który nie został wcześniej stworzony (np. jedno użycie new i dwa delete, albo delete bez new).



// 2. Pierwotnie problem był z tym że obie instancje klasy wskazują na jeden obiekt. Tak działał program ponieważ tak został napisany. Dlaczego?
Zastanówmy sie jak i kiedy działa usuwanie zmiennej.

Usuwanie to nic innego jak odczepienie jednej lub wielu komórek pamięci od programu. Nie są one fizycznie wyrzucane z komputera albo spalane na wieczność jak czarownice. Co więcej często nie są również czyszczone, więc zostają w nich dane (zwane śmieciami).
Dalej, zmienne 'odłączane' od programu są gdy np. program napotka '
}
' (zmienne lokalne), zostanie wywołany operator delete (free w c), lub środowisku runtime gdy Garbage Collector tak postanowi.

Tak więc:
C/C++
{
    cout << "Wybrales Zabojce" << endl;
    Zabojca gracz1;
    gracz1.rozdzaj_punkty();
    postac1 = & gracz1;
}

Tutaj 'odłączamy' adres zmiennej gracz1, ale zawartość zostaje w komórce pamięci.

Tutaj alokujesz miejsce na zmienną gracz2. Przypadkiem musi ona mieć jaki sam rozmiar i podobne rozłożenie zmiennych i metod wewnątrz i dziedziczyć po tych samych klasach bazowych. Dodatkowo kompilator nie wyczyścił starej zawartości.
C/C++
if( klasa == 1 )
{
    cout << "Wybrales Maga ognia" << endl;
    Mag_ognia gracz2;
    gracz2.rozdzaj_punkty();
    postac2 = & gracz2;
}

Do zmiennej postac2 przypisujesz adres, nie wartość. Adres zdaje się byc identyczny jak ostatni. Nie jest to niespodzianką gdy po między 'odłączeniem' zmiennej gracz1 a zalokowaniem zmiennej Mag_ognia nic więcej sie nie dzieje.

Tak oto wskaźniki postac1 i postac2 wskazują na jeden adres pod którym ostatnim żyjącym obiektem jest ktoś stworzony dla gracza drugiego.

// 3. Kolejna rzecz, pisałeś że masz problem z zasięgiem i dostępem, proszę wrzuć log z błędem.




P-173863
1 « 2 »
Poprzednia strona Strona 2 z 2