Buduję prosty projekt gry dla mojego projektu. Mam następujące klasy:Wskaźnik odlewania od typu podstawowego do typu dziecka
class Character
{
public:
virtual void Display();
virtual void SetParameters(char* param, ...);
};
class NonPlayableCharacter : public Character
{
public:
virtual void Display();
virtual void SetParameters(char* paaram, ...);
int GetNPCState();
}
A potem mam kilka klas, które wynikają zarówno z charakteru lub NonPlayableCharacter. Definiuję to tak:
std::vector<Character*> _allChar;
Mój problem polega na tym, że w dowolnym momencie chciałbym wykonać operację na jednym z elementów wektora. Tak więc wyjęcie elementu z wektora nie mogę bezpośrednio nazwać metodą GetNPCState()
, ponieważ element w wektorze jest typu Character *. Robiąc to:
_allChar[0]->GetNPCState();
nie działa. Więc próbowałem to robić ze słynnym dynamic_cast:
NonPlayableCharacter* test = dynamic_cast<NonPlayableCharacter*>(_allChar[0]);
test->GetNPCState();
Problem z tej ostatniej próbie, że GetNPCState()
awarii, ponieważ obiekt jest null, i wiem na pewno, że (przez debugowania), które _allChar [0] ISN” t null.
Otrzymujesz zerowy wskaźnik, gdy obiekt, który próbujesz rzucić na NonPlaya bleCharacter' nie jest tak naprawdę 'NonPlayableCharacter'. Prawdopodobnie niektóre z obiektów w wektorze pochodzą bezpośrednio z 'Character'. – jogojapan
Na marginesie pracuję z komponentem (elementami), który wykorzystuje wiele wektorów wskaźników. Spowodowało to dla mnie wiele kłopotów, ponieważ ten wektor kończy się czasami wskaźnikami usuniętej pamięci i prowadzi do uszkodzenia pamięci. Myślę, że używasz wektora wskaźnika, ponieważ używasz go polimorficznie i/lub obiekty są udostępniane.W obu przypadkach zdecydowanie zaleciłbym zmianę twojego wektora, by utrzymywał współdzielony typ wskaźnika (np. 'Std :: shared_ptr' lub zmienił twój wektor na' boost :: ptr_vector' (co jest świetne w obu scenariuszach). Powodzenia w grze! – Dennis