8 votes

Casting un pointeur d'un type de base vers un type enfant

Je construis un design de jeu simple pour un de mes projets. J'ai les classes suivantes:

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();
}

Et puis j'ai plein de classes qui dérivent soit de Character soit de NonPlayableCharacter. Je les définis comme ceci:

std::vector _allChar;

Mon problème est qu'à tout moment donné, je voudrais effectuer une opération sur un des éléments du vecteur. Donc, en récupérant un élément du vecteur, je ne peux pas appeler directement la méthode GetNPCState() car les éléments dans le vecteur sont de type Character*. Donc en faisant ceci:

_allChar[0]->GetNPCState();

ne fonctionne pas. J'ai donc essayé de le faire avec la célèbre dynamic_cast:

NonPlayableCharacter* test = dynamic_cast(_allChar[0]);
test->GetNPCState();

Le problème avec cette dernière tentative est que GetNPCState() plante car l'objet est nul, et je sais de manière certaine (via le débogage) que _allChar[0] n'est pas nul.

2voto

alestanis Points 11214

Pour obtenir un pointeur enfant à partir d'un pointeur de base, vous devez utiliser dynamic_cast. Son comportement est le suivant :

  • Si le pointeur pointe vers un Child* alloué avec new Child, alors dynamic_cast renvoie un Child*
  • Si le pointeur pointe vers autre chose, alors dynamic_cast renvoie NULL.

Votre problème est soit que vous n'avez pas alloué avec new, soit que votre objet est d'un type différent.

2voto

CashCow Points 18388

Il existe probablement une meilleure solution en POO à l'utilisation de dynamic_cast, mais tout l'intérêt de cet cast est qu'il renverra un pointeur NULL si le cast échoue.

Alors vérifiez si c'est NULL avant d'appeler GetNPCState();

NonPlayableCharacter* test = dynamic_cast(_allChar[0]);
if( test != NULL )
{   
     test->GetNPCState(); 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X