std::vector - wskaźnik na obiekt przechowywany w kontenerze
Ostatnio zmodyfikowano 2013-05-02 17:24
RazzorFlame Temat założony przez niniejszego użytkownika |
std::vector - wskaźnik na obiekt przechowywany w kontenerze » 2013-05-02 13:28:42 Tak sobie to nazwałem bo jest to do jasnej ciasnej troche nie fajne... Czy ja mam jakieś omamy czy co?
Rozwiązałem akurat problem ale to jest dość dziwne. Mam sobie klase:
class Army { vector < WarUnit > m_Units; public: WarUnit * addUnit( WarUnit unit ) { m_Units.push_back( unit ); return & m_Units.back(); } };
Następnie okazuje się że:
Army myArmy; WarUnit * unitPtr = myArmy.addUnit(...); WarUnit * unitPtr2 = myArmy.addUnit(...); cout << unitPtr->getAnimation(); << endl; cout << myArmy[ 0 ]->getAnimation(); << endl;
wyniki w cout są inne! Kiedy dodaje tylko 1 unit to działa. Kiedy dodaje 2 to przestaje. Nawet jeśli 'unitPtr' pokazuje nadal na ostatni element (drugiego ludzika a chce zeby na 1 ps. wiem jak to zrobic i nie o to chodzi) to okazuje się że myArmy[1] i unitPtr też są inne. Czyli unitPtr pokazuje w jakiś śmietnik. Dziwne. Poradziłem sobie z tym bo używam teraz myArmy[...] (w klasie Army jest operator []) i działa. Jednak nie wiem dlaczego nie moge zrobić ze wskaźnikami. Wytłumaczycie? |
|
ison |
» 2013-05-02 13:32:49 jak dodajesz element do wektora to wskaźniki tracą ważność, zamiast wektora obiektów zrób wektor wskaźników |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-05-02 13:38:56 Ale kiedy dam po dodaniu: unitPtr = myArmy[0] to działa. Hmm mam pomysł. Zaraz powiem czy dziala. Edit: Jeśli tracą ważność to czemu kiedy dodaje tylko 1 unit to działa? |
|
pekfos |
» 2013-05-02 13:44:05 Jeśli tracą ważność to czemu kiedy dodaje tylko 1 unit to działa? |
jak dodajesz element do wektora to wskaźniki tracą ważność |
..a jak najpierw dodajesz, a potem pobierasz adres, to wskaźnik jest prawidłowy. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-05-02 13:49:03 ..a jak najpierw dodajesz, a potem pobierasz adres, to wskaźnik jest prawidłowy. |
WarUnit * addUnit( WarUnit unit ) { m_Units.push_back( unit ); return & m_Units.back(); }
No popatrz. Dodaje do wektora i później zwracam wskaźnik na ten obiekt. A jeśli ten wskaźnik pokazuje zawsze na koniec to moge jeszcze dodać że: return & m_Units[ m_Units.size() - 1 ];
Też nie działa. Robie tak jak mówisz Ty pekfos. |
|
pekfos |
» 2013-05-02 17:20:51 Też nie działa. Robie tak jak mówisz Ty pekfos. |
A ja powiedziałem, co robisz, odpowiadając na zadane przez Ciebie pytanie: Jeśli tracą ważność to czemu kiedy dodaje tylko 1 unit to działa? |
|
|
DejaVu |
» 2013-05-02 17:24:00 Jeżeli koniecznie chcesz trzymać obiekty w std::vector to trzymaj je jako wskaźniki. std::vector kopiuje obiekty do nowego obszaru pamięci gdy vector się 'powiększa', więc każdy obiekt w kontenerze jest wielokrotnie kopiowany jak również niszczony. |
|
« 1 » |