Je construis un simple design de jeu pour un projet de mien. J'ai les classes suivantes: et ensuite j'ai un tas de classes qui dérivent de caractère ou de non-jouisseur. Je le définis comme si: p> Mon problème est que, à un moment donné, je voudrais effectuer une certaine opération sur l'un des éléments du vecteur. Donc, obtenir un élément hors du vecteur que je ne peux pas appeler directement la méthode getnpcstate () code> car l'élément du vecteur est de caractère * Type. Ce faisant cela: p>
NonPlayableCharacter* test = dynamic_cast<NonPlayableCharacter*>(_allChar[0]);
test->GetNPCState();
7 Réponses :
dynamic_cast code> renvoie
null code> si la distribution est impossible. Vérifiez ce qui est à l'intérieur
_allchar [0] code>. Vous pouvez créer une fonction comme
gettype () code> où renvoie l'identifiant de type prédéfini d'objet, puis utilisez
static_cast code>:
après Vous devez vérifier si La version correcte serait la suivante: p> test code> est
null code>. Même si
_AllChar [0] code> n'est pas NULL, le
dynamic_cast code> peut retourner
null code> si l'objet qu'il pointe de ne pas être un
NonplayableCharacter Code>. P>
Vous devez tester le dynamic_cast code> pour le succès. Il renvoie un pointeur NULL lors de l'échec suivant:
NonPlayableCharacter* test = dynamic_cast<NonPlayableCharacter*>(_allChar[0]);
if (test) test->GetNCPState();
dynamic_cast code> renvoie
null code> lorsque son argument ne pointe pas sur un
nonplayablecharacter code> (donc le premier élément de la matrice pointe probablement sur une autre Sous-classe du caractère
code>) - Vous devez donc vérifier
null code> après la distribution. Cependant, en utilisant
dynamic_cast code> peut indiquer un problème de conception. Peut-être devriez-vous plutôt avoir une méthode virtuelle sur
caractère code> appelé par ex.
EffectuerMainAgentingAmeloop () code> et est remplacé de manière appropriée dans les différentes sous-classes? P>
Pour obtenir un pointeur enfant d'un pointeur de base que vous devez utiliser Votre problème est que vous n'avez pas été alloué avec dynamic_cast code>. Son comportement est le suivant: p>
enfant * code> alloué avec
nouvel enfant code> alors
dynamic_cast
enfant * < / code> li>
dynamic_cast code> renvoie
null code>. li>
ul>
nouveau code> ou votre objet est d'un type différent. P>
Il y a probablement une meilleure solution oo à utiliser dynamic_cast, mais tout le point d'utilisation de cette distribution est qu'il retournera un pointeur null si le moule échoue.
Vérifiez pour NULL avant d'appeler getnpcstate (); < / p>
Il existe plusieurs types de moulages en C ++ (4), dont 2 sont des intérêts ici: P>
static_cast code> suppose que vous savez ce que vous faites li>
-
dynamic_cast code> chèques, au moment de l'exécution que vous "devinez" droit li>
ul>
Remarque: simplifié, comme dynamic_cast code> permet également des coulées croisées et des moulages impliquant des bases virtuelles. em> p>
Il y a 3 versions de dynamic_cast code>, en fonction de la nature de la cible: p>
- Si la cible est une référence (c'est-à-dire
dynamic_cast (u) code>), alors si la vérification échoue dynamic_cast code> jette un std :: bad_cast < / Code> Exception Li>
- Si la cible est un pointeur (c.-à-d.
dynamic_cast (p) code>), si les chèques échouent dynamic_cast code> renvoie un pointeur null li>
- Enfin, en tant que cas particulier, si la cible est
vide * code>, alors dynamic_cast code> renvoie plutôt l'adresse de l'objet complet li>
ul>
Dans ce cas, vous pouvez: P>
- Switch à partir de
dynamic_cast (_ allchart [0]) -> getnpcstate () code> à
dynamic_cast (* _ _ allchart [0]). Getnpcstate () code> et laisser l'exception propage li>
- Testez le résultat de la distribution (
non jouetable * Test code> ICI) pour la non-nullité li>
ul>
Vous obtenez un pointeur NULL lorsque l'objet que vous essayez de lancer vers
nonplayableCharacter code> n'est-il pas un
nonplayablecharacter code>. Probablement certains des objets du vecteur sont directement dérivés du caractère
code>.
De côté, je travaille avec un composant (s) qui utilise de nombreux vecteurs de pointeurs. Cela a causé beaucoup de problèmes pour moi, car ce vecteur se termine parfois avec des pointeurs sur la mémoire supprimée, et cela conduit à la corruption de la mémoire. Je suppose que vous utilisez un vecteur de pointeur parce que vous l'utilisez polymorphiquement, et / ou les objets sont partagés. Dans les deux cas, je recommande vivement de changer votre vecteur pour détenir un type de pointeur partagé (
std :: partagé_ptr code> par exemple) ou changez votre vecteur sur
boost :: ptr_vector code> (qui est idéal pour les deux scénarios). Bonne chance avec le jeu!