erreur: impossible de dynamic_cast ... (la cible n'est pas de pointeur ou de référence)
Je suis en train d'apprendre la gestion des exceptions en C++ et a couru dans un problème. Voici le code:
#include<iostream>
#include<exception>
using namespace std;
class A
{
public:
virtual void f(void){}
};
class AA:public A
{
public:
void aa(void){};
};
int main(void)
{
A a;
try
{
dynamic_cast<AA>(a).aa();
}
catch(exception ex)
{
cout<<"["<<ex.what()<<"]"<<endl;
}
return 0;
}
J'ai donc pensé que le try catch permettra à la fonction à exécuter et à me montrer le contenu de l'exception, mais mon compilateur ne pas compiler. J'utilise codeblock avec GNU GCC. S'il vous plaît aidez-moi et montrez-moi ce que je dois faire pour obtenir le code à exécuter comme je l'ai prévu. merci beaucoup.
Vous obtenez une erreur du compilateur. Il est important pour vous de partager cette erreur dans votre question, de sorte que vous pouvez apprendre à lire et à comprendre.
bien sûr. "ne peut pas dynamic_cast" a "(de type "classe A") de type "classe AA'(la cible n'est pas de pointeur ou de référence)
Qui est le principal problème ici.
Puisque vous êtes en train d'apprendre la gestion des exceptions: c'est le meilleur moyen d'attraper une exception est par const référence - c'est-à
bien sûr. "ne peut pas dynamic_cast" a "(de type "classe A") de type "classe AA'(la cible n'est pas de pointeur ou de référence)
Qui est le principal problème ici.
dynamic_cast
travaux sur l'indicateur ou des types de référence. AA
n'est pas un pointeur ou d'une référence de type.Puisque vous êtes en train d'apprendre la gestion des exceptions: c'est le meilleur moyen d'attraper une exception est par const référence - c'est-à
catch(const std::exception& ex)
OriginalL'auteur focusHard | 2013-06-16
Vous devez vous connecter pour publier un commentaire.
dynamic_cast
ne peut en fonte pour une valeur de pointeur ou de référence, ce qui est exactement ce que l'erreur est vous dire.De $5.2.7/1 de la Norme C++.
Pour
dynamic_cast
lancer une exception lorsque l'objet ne peut pas être converti vous avez besoin de jeter de référence. Modifier suivantes:Comme Johnsyweb souligné
dynamic_cast
toujours jeterstd::bad_cast
lors de la conversion échoue. Bien questd::bad_cast
est dérivé destd::exception
c'est toujours une bonne idée d'utiliser l'exception qui correspond le mieux attendre l'échec de la condition. Cela évite, par inadvertance, l'interprétation d'autres erreurs comme un échec de fonte.Pour l'appliquer à votre exemple, il pourrait ressembler le code ci-dessous.
[Ndlr, faire des choses comme
using namespace std;
est fortement déconseillée car elle peut entraîner des conflits avec les identifiants de l'espace de noms global. J'ai supprimé dans l'exemple ci-dessus.]après la modification de mon code <AA&>, le programme des sorties [std::exception]. comment puis-je obtenir à std::bad_cast? pouvez vous s'il vous plaît illustrer "c'est toujours une bonne idée d'utiliser l'exception qui correspond le mieux attendre l'échec de la condition" à l'aide de l'exemple de code? merci
mettre un
catch(std::bad_cast& e)
au-dessus de l'existantcatch()
bloc. Et#include<typeinfo>
.est dans le
typeinfo
en-tête. J'ai mis à jour ma réponse à inclure les modifications nécessaires à votre exemple. Une autre chose que vous devez faire est de commencer à l'aide de cppreference.com comme référence. Il propose des listes pertinentes fichiers d'en-tête et généralement fournit des exemples. Il peut être d'une grande aide lors de l'apprentissage de C++.il fonctionne maintenant, merci
OriginalL'auteur Captain Obvlious
Votre problème n'est pas avec la gestion des exceptions, mais avec votre dynamique de fonte:
dynamic_cast
en toute sécurité convertit pointeurs et références àclass
es et pas instances.De sorte que vous pouvez faire:
...qui va toujours d'échouer et de jeter un
std::bad_cast
exception.Vous devez attraper le plus de types spécifiques de
exception
que vous attendez et depuis la méthode recommandée pourcatch
est par référence, vous devriez préférer:Pour en savoir plus: dynamic_cast de conversion sur cppreference.com.
std::bad_cast
est définie dans l'en-tête<typeinfo>
. Vous aurez besoin de#include
.OriginalL'auteur Johnsyweb
Vous obtenez une erreur de compilation, car votre
dynamic_cast
n'est pas sur pointeur ou d'une référence.Modifier:
... et vous obtenez la bonne exception levée.
Sur le côté remarque: Smart compilateurs comme g++ garde ainsi:
avertissement:
dynamic_cast
sur un objet (icia
) ne peut jamais réussir.Il est donc préférable de limiter ce genre de code pour jouer autour. Dans la production de la qualité du code, la
dynamic_cast
doit être effectuée uniquement sur pointeur/référence.OriginalL'auteur iammilind
Je viens traitée avec la même erreur, mais dans mon cas, j'allais à partir d'un pointeur vers un pointeur, donc, de l'autre les réponses ici ne s'applique pas. Mon message d'erreur est légèrement différente, cependant:
error: cannot dynamic_cast 'f()' (of type 'class B*') to type 'class A*' (target is not pointer or reference to complete type)
.La cause racine dans mon cas était beaucoup plus simple et terre à terre.
Remarquer l'ajout de pour terminer type à la fin. Cela m'a amené à rappeler que je n'ai pas d'inclure le fichier d'en-tête pour les élèves de ma classe que j'utilisais. Il n'était pas un symbole inconnu car
A*
a été déclaré avant avecclass A;
dans le fichier d'en-tête, à l'origine d'exister mais ne pas être complète, d'où l'erreur.La solution dans mon cas était d'inclure le fichier d'en-tête pour la classe I a été coulée.
Ce n'est pas la question asker du problème ci-dessus, mais comme on peut le voir par mon cas, peut générer le même type d'erreur.
OriginalL'auteur Aaron