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

std::vector - wskaźnik na obiekt przechowywany w kontenerze

Ostatnio zmodyfikowano 2013-05-02 17:24
Autor Wiadomość
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:
C/C++
class Army //robie tower defense czy cos
{
    vector < WarUnit > m_Units; //WarUnit to klasa dla jednostki wojennej
public:
    WarUnit * addUnit( WarUnit unit )
    {
        m_Units.push_back( unit );
        return & m_Units.back();
    }
   
};
Następnie okazuje się że:
C/C++
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?
P-81788
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
P-81792
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?
P-81795
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.
P-81797
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.
C/C++
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:
C/C++
return & m_Units[ m_Units.size() - 1 ];
Też nie działa. Robie tak jak mówisz Ty pekfos.
P-81799
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?
P-81819
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.
P-81820
« 1 »
  Strona 1 z 1