Sto costruendo un progetto di gioco semplice per un mio progetto. Ho le seguenti classi:Puntatore della trasmissione da tipo base a tipo figlio
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();
}
E poi ho un sacco di classi che derivano sia dal carattere o NonPlayableCharacter. Mi definisco in questo modo:
std::vector<Character*> _allChar;
mio problema è che in un dato momento vorrei eseguire alcune operazioni su uno degli elementi del vettore. Quindi, ottenendo un elemento dal vettore, non posso chiamare direttamente il metodo GetNPCState()
perché l'elemento nel vettore è di tipo Carattere *. Quindi:
_allChar[0]->GetNPCState();
non funziona. Così ho provato a fare con il famoso dynamic_cast:
NonPlayableCharacter* test = dynamic_cast<NonPlayableCharacter*>(_allChar[0]);
test->GetNPCState();
Il problema con questo ultimo tentativo è che GetNPCState()
crash perché l'oggetto è nullo, e so per certo (tramite il debug) che _allChar [0] isn' t null.
Si ottiene un puntatore nullo quando l'oggetto che si sta tentando di trasmettere in 'NonPlaya bleCharacter' non è in effetti un 'NonPlayableCharacter'. Probabilmente alcuni degli oggetti nel vettore sono derivati direttamente da 'Character'. – jogojapan
Come parte, io lavoro con un componente (s) che utilizza molti vettori di puntatori. Ha causato un sacco di guai per me, dato che questo vettore finisce a volte con dei puntatori alla memoria cancellata, e porta alla corruzione della memoria. Immagino che tu usi un vettore puntatore perché lo stai usando in modo polimorfico e/o gli oggetti sono condivisi.In entrambi i casi, consiglio vivamente di cambiare il vettore per tenere un tipo di puntatore condiviso ('std :: shared_ptr' per esempio) o cambiare il vettore in' boost :: ptr_vector' (che è ottimo per entrambi gli scenari). Buona fortuna con il gioco! – Dennis