002
02.01.2018, 09:32 Uhr
ao
(Operator)
|
Ich habe das Programm lauffähig gemacht und folgende Ausgaben bekommen:
Code: |
$ ./kreis K1:: Flaeche 12.64 Umfang 12.64 Z1:: KreisFlaeche 28.44 KreisUmfang 18.96 Zylinderflaeche 132.72 Zylindervolumen 113.76
|
Kann das stimmen?
Zu deinem Klassendesign:
C++: |
class Kreis { public: Kreis(); double Radius; double PI; void BerechneKreisFlaeche(); void BerechneKreisUmfang(); double Flaeche; double Umfang; };
|
1. Es ist sehr ungewöhnlich, Variablen wie Radius, Flaeche, Umfang public zu machen, weil man dadurch jegliche Kontrolle verliert, wer von außen auf das Kreis-Objekt zugreift und seine Eigenschaften ausliest und verändert. Manchmal gibt es Gründe dafür, aber für Anfänger gilt die Regel: Membervariablen sollen grundsätzlich private oder protected, d.h. von außen nicht erreichbar sein.
2. Das führt zu der Frage, wie man denn Berechnungsergebnisse (Fläche, Umfang) abholen kann. Antwort: Indem man schreibt: double BerechneKreisFlaeche(); Dadurch bekommt die Funktion einen Rückgabewert (Typ double), in dem man den Flächeninhalt nach außen geben kann.
Dasselbe gilt natürlich auch für Zylinder.
3. Pi ist keine Eigenschaft des Kreises. Es sollte deshalb auch kein Member von Kreis sein.
4. Die Ableitung class Zylinder : public Kreis möchte ich in Frage stellen. Mit dieser Beziehung behauptest du "ein Zylinder ist ein Kreis", und das ist so nicht wahr, schon weil die Flächen-Eigenschaft ganz anders verstanden wird. Die Konsequenzen davon hast du schon gespürt, als du unterscheiden musstest zwischen BerechneKreisFlaeche und BerechneZylinderFlaeche. Und derartige Probleme werden größer, wenn die Klassenentwürfe größer werden.
Grundsätzlich muss man Ableitungsbeziehungen sehr sorgfältig definieren und genau prüfen, ob es sich wirklich um eine "ist ein"-Beziehung handelt.
Ein besserer Ansatz ist meiner Meinung nach: "Ein Zylinder hat einen Kreis", was ausgedrückt wird durch eine Member-Beziehung:
C++: |
#include "kreis.h" class Zylinder { Kreis grundflaeche; };
|
Damit sind der Zylinder und seine Grundfläche immer noch verschiedene Objekte mit verschiedenen Eigenschaften, trotzdem gibt es keinen Zylinder ohne kreisförmige Grundfläche, und über geeignete Methoden kann man auch auf die Grundflächen-Eigenschaften zugreifen. |