Wskaźniki w klasie na element innego obiektu tej klasy

0

Witam,
nazwa tematu jest poniekąd enigmatyczna, ale już mówię o co chodzi.
Piszę w C++ prostą "grę". W tej grze mam symulację zahcowania zwierząt przeprowadzić. W każdym obiekcie mam tablicę współrzędnych(y,x) na mapie, w konstruktorze przydzielam

int* wsp = new int[2]

i w destrukotzrze (gdy zwierze umiera) zwalniam i ustawiam wskaźnik na NULLa. I tu jest właśnie mój problem - jeśli w innym zwierzęciu zapiszę wskaźnik na współrzędne mojego pierwszego obiektu (np chce go zjeść) int * z = wsp;

, a on w miedzyczasie umiera, to ten wskaznik (z) wcale nie jest równy zero. Jak to najprościej rozwiązać? Wskaźnik na wskaźnik wspolrzednych? Wolałbym nie, bo używam go w wielu miejscach programu i łatwo można się pomylić - można jakoś inaczej?
Dzięki za pomoc!
4
  1. nie uzywaj golych wskaznikow. od tego jest RAII
  2. nie uzywaj tablic od tego jest vector
  3. zamiast tablic wspolrzednych napisz prostra strukture
struct Point
{
  int x,y
}

i korzystaj z tego (dzieki temu ominiesz alokowania dwoch intow na stercie...)

0

Dzięki za odpowiedź.
Jednak gdy będę miał punkt jako strukturę, jak mogę poinformować, że już ona nie istnieje?

0

jezeli nie chcesz miec punktu na mapie to usun go z kolekcji w ktorej to przetrzymujesz

Nie rozumiem troche po co chcesz usuwac punkt...
powiedz dokladnie co chcesz zrobic

0

tak analizuję Twój problem i chyba wiem w czym rzecz. Twoje opisane działanie:

qwop napisał(a):

jeśli w innym zwierzęciu zapiszę wskaźnik na współrzędne mojego pierwszego obiektu (np chce go zjeść)

int * z = wsp;

, a on w miedzyczasie umiera, to ten wskaznik (z) wcale nie jest równy zero.

generuje problem, jakim jest dangling pointer. Gdy niespodziewanie atakowany obiekt ginie to obiekt atakujący wciąż trzyma adres zniszczonego już obiektu będącym jego położeniem. Twój kod wygląda mniej więcej tak: https://ideone.com/Bu2L2g zwróć uwagę na output:

A attack: nothing
B attack: nothing
A attack: 5.000000 5.000000
B attack: 5.000000 5.000000
C is destroyed!
A attack: 0.000000 5.000000
B attack: 0.000000 0.000000
B is destroyed!
A is destroyed!

kiedy obiekt C zostaje niespodziewanie zniszczony wtedy obiekty A i B trzymają nieaktualne dane o zniszczonym C.

qwop napisał(a):

jak mogę poinformować, że już ona nie istnieje?

Gdy koniecznie chcesz trzymać się swojego podejścia (przekazywać wskaźnik) to na chwilę obecną pomysł mam jeden - przekazać adres nie do położenia (strukturki), a samego jego obiektu atakującego i do powiadamiania zastosować coś podobnego do wzorca projektowego obserwator. Uzupełniasz klasę o potrzebne funkcje powiadamiające (coś w ten deseń): https://ideone.com/zwhF4K , a rezultat masz wtedy następujący:

A attack: nothing
B attack: nothing
A attack: C 5.000000 5.000000
B attack: C 5.000000 5.000000
C is destroyed!
A attack: nothing
B attack: nothing
B is destroyed!
A is destroyed!
0

Użyj "dowolnego" pointera z reference counting (shared_ptr albo intrusive_ptr)

1 użytkowników online, w tym zalogowanych: 0, gości: 1