0

Je ne suis pas sûr que la question soit appropriée mais je ferai de mon mieux.comment lancer une exception quand il n'y a pas de constructeur dans la classe héritée?

Ceci est mon problème de devoirs. Les devoirs me demandent de lancer une exception si deux lignes sont parallèles ou égales.

Les codes d'origine sont fournis par mon professeur et mon travail est de le modifier pour le rendre capable de lancer une exception.

line.h

class RuntimeException{ 
private: 
string errorMsg; 
public: 
RuntimeException(const string& err) { errorMsg = err; } 
string getMessage() const { return errorMsg; } 
}; 

class EqualLines: public RuntimeException{ 
public: 
//empty 
}; 

class ParallelLines: public RuntimeException{ 
public: 
//empty 
}; 

class Line{ 
public: 
Line(double slope, double y_intercept): a(slope), b(y_intercept) {}; 
double intersect(const Line L) const throw(ParallelLines, 
        EqualLines); 
//...getter and setter 
private: 
double a; 
double b; 
}; 

Professeur nous a dit de ne pas modifier le fichier d'en-tête, seul le fichier .cpp peut être modifed.

line.cpp

double Line::intersect(const Line L) const throw(ParallelLines, 
         EqualLines){ 
//below is my own code 
if ((getSlope() == L.getSlope()) && (getIntercept() != L.getIntercept())) { 
//then it is parallel, throw an exception 
} 
else if ((getSlope() == L.getSlope()) && (getIntercept() == L.getIntercept())) { 
//then it is equal, throw an exception 
} 
else { 
    //return x coordinate of that point 
    return ((L.getIntercept()-getIntercept())/(getSlope()-L.getSlope())); 
} 
//above is my own code 
} 

puisque ces deux classes héritées sont vides donc pas de constructeur pour initialiser le errorMsg, ni je peux créer un objet de ces classes à jeter exception. Toute autre solution pour y parvenir? Parce que vous avez un spécificateur d'exception, vous ne pouvez lancer que EqualLines ou ParallelLines

+2

Le code que vous avez publié utilise les anciennes spécifications 'throw'. Pensez à les supprimer et à utiliser le nouveau spécificateur 'noexcept' si la fonction ne lance rien, et rien d'autre. Dans votre cas, veuillez informer votre professeur de ne plus utiliser cette vieille technique – Rakete1111

+2

* Le professeur nous a dit de ne PAS modifier le fichier d'en-tête, seul le fichier .cpp peut être modifié. * - Votre professeur devrait savoir que les exceptions définies par l'utilisateur être dérivé de 'std :: exception', ie' class RuntimeException: public std :: exception {...}; ' – PaulMcKenzie

+0

@PaulMcKenzie Pourquoi devraient-ils dériver de' std :: exception'? – 0x499602D2

Répondre

5

Ces types d'exception n'ont pas de constructeur par défaut (leur type de base n'a pas de constructeur par défaut) et n'ont pas d'autres constructeurs. La seule façon de construire l'une de ces exceptions est de copier une exception existante. Il est impossible de lancer l'une ou l'autre de ces exceptions sans modifier les en-têtes ou violer la norme. Je voudrais consulter le professeur, cela ressemble à une erreur pour moi.

En général, les spécificateurs d'exception sont une mauvaise idée. See this answer. Ils sont en fait obsolètes.

+0

Plusieurs de mes camarades de classe ont déjà consulté le professeur et l'AT, mais voici ce qu'ils nous ont dit jusque là. –

+1

Son affectation est défectueuse. Vous devez choisir de rompre les règles d'attribution ou les règles du langage. –

+0

Voici ce que TA dit: "Depuis fréquemment demandé, voici l'indice que je peux fournir: Encore une fois, les deux classes héritées EqualLines et ParallelLines sont dérivées de la superexécution RuntimeException.Tant que Dr. Tindell a fait un commentaire sur le code, tous les variables membres et les fonctions membres (y compris le constructeur) dont vous avez besoin sont héritées de la RuntimeException de la superclasse, car le corps des EqualLines et des ParallelLines est vide, autrement dit, quelles que soient les fonctionnalités de la superclasse, ces deux classes héritées " –