Verbesserungsvorschläge



  • Sehr geehrte Community,

    die Aufgabe die ich zu bearbeiten habe lautet wie folgt:

    Ich soll eine Klasse namens Rectangle erstellen.
    Der Output eines Objektes dieser Klasse soll length, width, area und scope sein.

    Zu beachten soll sein :

    Welche Funktionen können versteckt sein (Which functions can be hidden?)
    - Ist damit die Datenkapselung gemeint ?
    Welche Funktionen müssen sichtbar sein (Which functions need to be visible?)
    - S.o.

    Verstehe diese zwei Punkte nicht ganz. Ich habe das jetzt mal wie folgt gemacht und würde gerne wissen ob es so richtig ist.

    class Rectangle {
    private:
        float length;
        float width;
    public:
        void setLength(float l);
        void setWidth(float w);
        float getLength() {return length;}
        float getWidth() {return width;}
        float calculateArea(float a, float b);
        float calculateScope(float c,float d);
    };
    
    void Rectangle::setLength(float l){
        length=l;
    }
    
    void Rectangle::setWidth(float w){
        width=w;
    }
    
    float Rectangle::calculateArea(float a,float b){
        return a*b;
    }
    
    float Rectangle::calculateScope(float c,float d){
        return 2*c+2*d;
    }
    
    int main(){
    
    Rectangle eins;
    
    eins.setLength(12);
    eins.setWidth(3);
    
    eins.calculateArea(eins.getLength(),eins.getWidth());
    eins.calculateScope(eins.getLength(),eins.getWidth());
    
    cout << "Lenght: " << eins.getLength() << endl;
    cout << "Width: " << eins.getWidth() << endl;
    cout << "Area: " << eins.calculateArea(eins.getLength(),eins.getWidth()) << endl;
    cout << "Scope: " << eins.calculateScope(eins.getLength(),eins.getWidth()) << endl;
    
    return 0;
    }
    


  • Es sollen natürlich Fläche und Umfang DIESES Rechtecks berechnet werden. Also benutze auch die Attribute (oder Getter) innerhalb.



  • Erstmal vielen Dank für deine Antwort.

    Habe jedoch leider nicht verstanden was du mit "DIESES Rechteck" und mit "innerhalb" meinst. Könntest du mir das erläutern ?

    Vielen herzlichen Dank.



  • float Rectangle::calculateArea(){
        return length*width;
    }
    


  • Zuerst kommen mir folgende Fragen in den Sinn:

    Sollte ein Rechteck, dass einmal erzeugt wurde veraendert werden koennen? Das kann je nach Anwendungsfall mal mit ja oder nein beantwortet werden. Annahme: Nein.

    Wie oft werden die einzelnen Attribute eines Rechtecks abgerufen (Laenge a, Laenge b, Umfang, Flaeche)? Das, was oft gefragt wird, sollte aus Performancegruenden schon vorberechnet sein. Annahme: Flaeche und Umfang.

    Welche Funktionen koennen versteckt sein? Alle die, die der Anwender nicht direkt aufrufen muss.

    class Rectangle
    {
    public:
        Rectange(const float a, const float b) : a_(a), b_(b)
        {
            if (a<0.0 || b<0.0)
            {
                throw ranger_error("negative");
            }
            // pre-calculate area and circumfence as they are often used
            // (performance-critical)
            area_ = a_*b_;
            circumfence =2*(a+b);
        }
    
        float area()
        {
            return area_;
        }
    
        float circumfence()
        {
            return circumfence_;
        }
    
        float aLength()
        {
            return a_;
        }
    
        float bLength()
        {
            return b_;
        }
    
    private:
        float a_;
        float b_;
        float area_;
        float circumfence_;
    };
    


  • Vielen Dank volkard, habe jetzt verstanden was du meinst.

    ArchiMed vielen Dank für deine hilfreiche Antwort.
    Das mit den Vorberechnen von Werten ist ein guter Ratschlag.

    Ich stecke aber immernoch bei dem Wort "versteckt" in Bezug auf Funktionen fest, da nicht verstehe wo eine Funktion versteckt sein soll.

    In deinem Quellcode sagt mir das Wort "throw" derzeit leide rnichts. Das kommt aber sicher noch 🙂



  • Die Aufgabe ist merkwürdig. Mir fällt im Moment keine Methode ein, die man sinnvoll private machen kann. Ebenso ist mir nicht ganz klar, was ein Output einer Klasse sein soll. Das Interface? Oder doch der operator<< ? Von einem Konstruktor ist auch nirgends die Rede obwohl dieser ziemlich praktisch ist. Ausserdem const -correctness beachten! Methoden, die nichts verändern, sollten const hinten dran haben, sonst wird man manchmal Mühe haben sie aufzurufen!

    Ps.: Ist der geometrische Umfang auf Englisch nicht Perimeter? Scope ist ja allgemein der Umfang / Rahmen (nicht geometrisch) und Circumference ist afaik der Kreisumfang (sagt ja das Wort ja schon).

    Edit: Für Interessierte.

    Edit 2: @TE: Hast du einen Link oder so zu der Aufgabenstellung?



  • asfdlol schrieb:

    Ps.: Ist der geometrische Umfang auf Englisch nicht Perimeter? Scope ist ja allgemein der Umfang / Rahmen (nicht geometrisch) und Circumference ist afaik der Kreisumfang (sagt ja das Wort ja schon).

    Edit: Für Interessierte.

    Danke fuer den Hinweis!

    asfdlol schrieb:

    Mir fällt im Moment keine Methode ein, die man sinnvoll private machen kann

    Ist mir auch nicht eingefallen.



  • also da sich das wie eine typische Professoren aufgabe anhört würde ich die Klasse einfach etwas anders aufbauen.

    class Rectangle {
    private:
        float length;
        float width;
        float area;
        flaot scope;
        void calculateArea(float a, float b);
        void calculateScope(float c,float d);
    public:
        //angabe der parameter des Rechteckes über den konstruktor
        void Rectangle(float lenght, float width)    
        float getLength() {return length;}
        float getWidth() {return width;}
        float get scope() {return scope;};
        float getwidth() {return area;};    
    };
    

    So kanst du nun im Konstruktor alle wichtigen Elemente des rechtecks ausrechnen(lassen). Bei diesem ansatz können die beiden calculate funktionen private sein und die getFkt's müssen eh public sein.

    mfg BabCom



  • Bitte auf const-correctness achten.

    class ...
    {
    ...
    //  ReturnType getXxx();
    // =>
        ReturnType getXxx() const; // Wir ändern ja nix
    

Anmelden zum Antworten