Körper- und Flächenberechnung



  • Hallo,

    ich möchte ein paar Klassen (für die FH und zum Üben) schreiben um Körper- und Flächenberechnung durchzuführen.

    Wollte zwei abstrakte Klassen machen "Körper" und "Fläche", von diesen sollen dann alle anderen Klassen wie Kugel, Quader, Rechteck, Kreis... abgeleitet werden.

    Nur was soll ich in die abstrakten Basisklassen packen? Variablennamen sind nicht sinnvoll, da der eine Körper eine Höhe benötigt, der andere eine Seitenfläche, ein anderer einen Radius... dadurch entfallen auch get und set-Methoden da ich diese nicht sinnvoll benennen kann. Schließlich braucht ein Kreis keine get oder set-Methode für eine Seitenfläche a, die aber ein Rechteck braucht.

    Das einzige was man in die abstrakten Klassen packen kann ist virtuelle Methoden (also nicht implementiert) von getVolume und getSurface die man dann in der Ableitung implementiert. Aber das kann ich mir ja im Prinzip sparen, bringt ja nicht wirklich Vorteile.

    Gibt es nun doch eine Möglichkeit eine kleine Baumstruktur aufzubauen, oder sind die Objekte einfach zu unterschiedlich?



  • MarcoGomez schrieb:

    Nur was soll ich in die abstrakten Basisklassen packen? Variablennamen sind nicht sinnvoll, da der eine Körper eine Höhe benötigt, der andere eine Seitenfläche, ein anderer einen Radius...

    Naja, wenn du es ein wenig abstrakter siehst, hat ein Kreis genau so eine Höhe und Breite, wie ein Rechteck. Heißt beim Kreis halt "Radius". Anhand dieser Höhe und Breite kannst du ja dann auch "Mittelpunkt" oder "linker oberer Eckpunkt" usw berechnen. Das Gleiche gilt bei den Körpern.

    Aber wenn du mit dem Beispiel Probleme hast, dann nimm doch einfach ein anderes Beispiel. Die Klasse "Fahrzeug" ist so ein unerschöpfliches Beispiel. Davon kannst du PKW, LKW, Zweirad usw ableiten. Davon gibts auch wieder unzählige Unterklassen. Ganz zu schweigen von den Eigenschaften mit denen du spielen kannst (Farbe, Verbrauch, Ladefläche, Vmax ...)



  • Es ist schon richtig, dass die Basisklassen nur virtuelle Funktionen besitzen sollten.
    Der Vorteil liegt dann darin, dass Du funktionen schreiben kannst, die ein Objekt vom Typ 'Flaeche' als Argument benutzen, und sie trotzdem mit 'Kreis', 'Rechteck' usw. aufrufen kannst:

    class Flaeche
    {
    public:
       virtual double flaeche() = 0;
    };
    
    class Kreis: public Flaeche;     // flaeche = pi*r^2
    class Rechteck: public Flaeche;  // flaeche = a*b
    
    void print_flaeche(const Flaeche& f)
    {
      std::cout << "Objekt hat die Flaeche " << f.flaeche() << '\n';
    }
    
    int main()
    {
      Kreis k(2.4);    // Kreis mit Radiu
      Rechteck r(3.141, 2.71);  // Rechteck mit 2 Seiten
    
      // Abstraktion:
      print_flaeche(k);
      print_flaeche(r);
    }
    

    Ohne die virtuelle Basisklasse muesstest Du fuer jeden Typ 'print_flaeche()' ueberladen.
    Bei groesseren Projekten kann das viel Arbeit ersparen. Ausserdem kann die Basisklasse dann die Existenz bestimmter Funktionen in den abgeleiteten Klassen 'erzwingen', was die Codepflege erleichtert.



  • Hi!

    Irgendwie hab ich ein Problem damit, wenn man Kreis und Rechteck von der Klasse Flaeche ableitet. Eine bessere alternative wäre hier sowas wie "Form", oder "Shape". Außerdem hat die Klasse Flaeche eine Methode "flaeche" welches die Oberfläche der Form zurückgibt. Ich bin der Meinung das beisst sich alles ganz gewaltig.

    grüße



  • Das ist ja mehr eine Frage der guten/ sinnvollen Namensgebung als der Implementierungsdetails.



  • Hi!

    Ich denke eine gutes Design ist ganz essenziell wichtig und sollte auf jedenfall beachtet werden. Auch bei so trivialen Aufgaben wie dieser.

    grüße



  • Danke für die Antworten (und den Hinweis auf Shape, bin leider nicht drauf gekommen , finds auch wesentlich aussagekräftiger), im Programm hab ich dann sowieso englische Bezeichnungen verwendet...


Log in to reply