2016-08-25 1 views
0

Considérons deux géométries Triangle et Line qui héritent de la structure de base Geometry. Les structures dérivées héritent de la fonction virtuelle get_area() de sorte que Triangle calcule normalement la zone mais Line devrait donner une erreur indiquant que get_area() n'est pas pertinent pour Line. Quand une erreur est affichée je voudrais savoir quelle structure a appelé get_area() et où (numéro de ligne) et enfin terminer le programme. Cela n'a pas d'importance si l'erreur est affichée lors de la compilation ou de l'exécution. Comment puis-je faire cela?Donner une erreur dans la fonction virtuelle

struct Geometry 
{ 
    virtual double get_area() = 0; 
}; 

struct Triangle: Geometry 
{ 
    double get_area() override {/* some code. */} 
}; 

struct Line: Geometry 
{ 
    double get_area() override {/* give error. */} 
}; 
+6

Peut-être que vous devez repenser votre conception? Ou votre implémentation à tout le moins? Si les lignes n'ont pas de zone alors la classe 'Line' ne devrait pas * avoir * une telle fonction? –

+0

On dirait que vous avez besoin d'une classe 'line' qui est membre d'une classe' polygon' et que vous pouvez dériver de 'polygon' pour créer vos formes. – NathanOliver

Répondre

0

En supposant que votre keep votre conception actuelle, malgré le défaut expliqué par Joachim Pileborg:

Une mise en œuvre possible pour la méthode est la suivante:

double Triangle::get_area() override 
{ 
    assert(false); 
    return 0.; 
} 

Motivations:

en mode débogage , assert(condition); quittera le programme si la condition est fausse. En supposant que vous avez votre débogueur IDE &, vous serez en mesure de voir qui a appelé la méthode. Toutefois, dans une version de version régulière, les assertions sont désactivées. return 0.; garantit que tout ce qui a du sens est renvoyé.
(Note: ceci peut être changé par la façon dont vous utilisez la valeur de zone.NAN peut être un bon choix).

Notes:

  • La question sera pops nécessairement au moment de l'exécution, parce que vous utilisez des méthodes virtuelles. C'est une odeur de design, qui peut être résolue de plusieurs façons (en définissant la zone d'une ligne comme 0, en créant des classes intermédiaires Shape1D et Shape2D, ...)

  • Obtenir l'appelant, c'est-à-dire une pile d'appels à partir du code seulement plus difficile en C++ que les langages comme Java. L'obtention est définie par l'implémentation, ainsi que l'obtention de noms lisibles par l'utilisateur des méthodes. Cependant, être en mode débogage + avoir un débogueur (ce qui est le cas avec la plupart des IDE) vous permet de le faire sans douleur.