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:
{
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.
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.