Problem z zapamiętaniem ściganego obiektu przez inny obiekt
Ostatnio zmodyfikowano 2015-07-29 22:37
Nekronomik Temat założony przez niniejszego użytkownika |
Problem z zapamiętaniem ściganego obiektu przez inny obiekt » 2015-07-28 21:20:29 Witam, zapamiętanie obiektu przez obiekt nie stanowi tak naprawdę problemu np obiekt[10]; atakuje obiekt [1];. Wystarczy ze obiekt[10] zapamięta numer tablicy obiektu atakowanego obiekt[1]; czyli "1". Problem się pojawia gdy dodaję funkcje odpowiadającą za segregowanie obiektów. Czyli jeśli obiekt[0] zginie to obiekt[1] zastępuje obiekt[0] a obiekt[10] zastępuje obiekt[9]. problem już się pojawił bo teraz obiekt[9] (po segregacji) atakuje obiekt[1] co jest błędem bo to jest inny już obiekt, nawet sam obiekt[0] nie wiedział by przed czym uciekać (albo by uciekał przed innym obiektem)> można by zrobić aby każdy obiekt miał indywidualny id i dzięki temu się szukał lecz trzeba wtedy zrobić pętle w pętli i każdy obiekt przemielić z innym obiektem co jest mało wydajne przy setkach obiektów może ma ktoś pomysł jak to rozwiązać ? Chyba że jest inny sposób na zapamiętywanie obiektu przez obiekt niż to co ja sobie wymyśliłem. |
|
pekfos |
» 2015-07-28 21:24:18 Nadaj obiektom identyfikatory. |
|
Kaikso |
» 2015-07-29 00:08:13 Zamiast identyfikatorów użyj wskaźników. |
|
pekfos |
» 2015-07-29 13:42:33 Zamiast identyfikatorów użyj wskaźników. |
Zamiast wskaźników użyj identyfikatorów. Same wskaźniki są jeszcze gorsze od zapamiętywania indeksów. Ale jeśli już musisz iść w adresy, to w tablicy trzymaj wskaźniki shared_ptr<>, a w obiektach zapamiętuj adres w weak_ptr<>. |
|
Nekronomik Temat założony przez niniejszego użytkownika |
» 2015-07-29 17:39:51 Nie bardzo rozumiem o co chodzi z tymi identyfikatorami. |
|
pekfos |
» 2015-07-29 19:30:31 Dodaj do obiektu pole z liczbowym identyfikatorem. Dopisz jakiś generator, by każdy tworzony obiekt dostawał unikatowe id (choćby i return ++lastId;). Skoro masz interakcje pomiędzy obiektami, to masz jakiś obiekt nadrzędny dla wszystkich innych. Dodaj do niego (obok, lub zamiast tablicy obiektów) mapę, kojarzącą id z adresami obiektów (wtedy trzeba alokować dynamicznie i można użyć zwykłych wskaźników, lub unique_ptr<>). Zapamiętujesz id, a obiekt nadrzędny podaje ci element o tym id. Możesz też użyć rozwiązania z shared_ptr<> i weak_ptr<>. Adres zaalokowanego dynamicznie obiektu też jest swego rodzaju unikalnym identyfikatorem, który ma tę zaletę, że od razu można się przez niego odwołać do wskazywanego obiektu (co nie zawsze jest pożądane). |
|
Kaikso |
» 2015-07-29 22:02:14 A nie łatwiej użyć tablicy asocjacyjnej z kluczem typu int, jak np. std::map < int, TwojaKlasa * > ? |
|
pekfos |
» 2015-07-29 22:37:30 A nie łatwiej użyć tablicy asocjacyjnej z kluczem typu int, jak np. std::map < int, TwojaKlasa * > ? |
Łatwiej, niż co? Dodaj do niego (obok, lub zamiast tablicy obiektów) mapę, kojarzącą id z adresami obiektów |
|
|
« 1 » |