Erreur de spécificateur de lancement de Looser en C ++
Le code suivant génère le "Looser jeter spécificateur d'erreur". Pourriez-vous svp m'aider à surmonter cette erreur?
class base
{
virtual void abc() throw (exp1);
}
void base::abc() throw (exp1)
{
......
}
class sub : public base
{
void abc() throw(exp1, exp2);
}
void sub::abc() throw (exp1, exp2)
{
.....
}
source d'informationauteur rajan
Vous devez vous connecter pour publier un commentaire.
Le problème vient du fait que le sous-classe doit être utilisable partout où la classe de base peut être utilisé, et ne doit pas jeter des types d'exceptions autres que celles spécifiées dans la classe de base.
Il y a trois solutions:
Je suggère de les retirer; ils sont largement considérés comme une mauvaise idée, en partie à cause de questions de ce genre. Comme Matthieu, la Norme le Comité est d'accord, et à l'exception des prescripteurs sont dues à être obsolète dans la prochaine version de la Norme.
Lorsque vous remplacez une méthode virtuelle avec un jet spécificateur dans une classe dérivée, la méthode de la classe dérivée ne peut pas lancer plus d'exceptions que de la méthode de la superclasse. Si vous avez été autorisé à ce faire, vous pouvez rompre le contrat créé par la super-classe de l'API publique par la redéfinition des méthodes dans une sous-classe.
Dans votre exemple, vous êtes en train de dire que de base::abc peut que jeter exp1. Toutefois, si vous avez un pointeur de type de base qui est vraiment pointant vers une instance de sous, tout d'un coup, abc peut jeter exp2 en plus d'exp1.
Pour résoudre le problème, vous devez supprimer exp2 de le lancer rédacteur de devis dans la sous-classe ou d'ajouter exp2 à le jeter spécificateur de la super-classe.
Supposons que j'essaie
Basé sur le lancer spécificateur de
base::abc
je m'attends qu'il ne lanceexp1
; maissub::abc
dit qu'il peut également lancer desexp2
.Si
sub::abc
peut vraiment jeterexp2
puis ajouterexp2
à la liste de ce quebase::abc
pouvez jeter. Si non, alors le supprimer desub::abc
la liste.Et mieux: ne pas utiliser de jeter les prescripteurs. Pour plus d'info, voir Quelqu'un peut-il expliquer les exceptions C++ spécifications pour moi? et http://www.gotw.ca/publications/mill22.htm.