Anfängerfrage Vererbung



  • Hallo,
    wer kann mir freundlicherweise sagen, warum ich hier immer einen Fehler bei Ring::Ring... erhalten.

    Vielen Dank.
    Ein Anfänger

    #include <iostream>
    using namespace std;
    
    class Kreis
    {
    private:
        float kreisflaeche;
    public:
        Kreis(float);
        void out();
    };
    
    Kreis::Kreis(float radius)
    {
        kreisflaeche = 3.14 * radius;
    }
    
    void Kreis::out()
    {
        cout <<kreisflaeche;
    }
    
    class Ring:public Kreis
    {
    private:
        float ringflaeche;
    public:
        Ring(float);
        void out();
    };
    
    Ring::Ring(float radius) : Kreis(radius)
    {
        ringflaeche = Kreis(radius);
    }
    
    void Ring::out()
    {
        cout <<ringflaeche;
    }
    
    int main()
    {
        Kreis k(12);
        k.out();
        return 0;
    }
    


  • der fehler: du versuchst ein Objekt vom Typ Kreis an ein float zuzuweisen. Allerdings ist mir unklar, was du mit dieser Zeile (ringflaeche = Kreis(radius)) bezweckts 😕



  • Hallo,
    ich will einfach nur, dass in ringflaeche der Wert des Kreises aus der Klasse Kreis steht (stelle gerade fest, dass die Formel falsch ist - egal). Die Berechnung des Kreises soll aber in der Klasse Kreis vorgenommen werden.
    Hoffe, mich klar ausgedrückt zu haben 😞 .

    Viele Grüße
    doofer Anfänger



  • dann spendier der Kreisklasse doch eine Methode getKreisFlaeche, und schrein den Konstruktor so:

    Ring::Ring(float radius): Kreis(radius) {
      ringflaeche = getKreisFlaeche(); // mathematisch falsch aber egal
    }
    

    pack die Methode wenn sie nicht öffentlich sein soll in die protected: Sektion.



  • Danke, aber ich wollte es ja gerade ohne eine neue Methode hinbekommen, sondern direkt den Konstruktor von Kreis anzapfen.



  • Der Konstruktor von Kreis hat genau eine einzige Aufgabe: Ein Objekt vom Typ Kreis zu konstruieren. Was willst du da anzapfen. Zu dem Zeitpunkt, zu dem der Konstruktor von Ring läuft, ist der Konstruktor von Kreis schon längst abgelaufen.

    Wenn du Zugriff auf die Variable kreisflaeche benötigst ist eine Methode das vernünftigste, evtl. kannst du die Variable auch protected machen. Technisch geht auch noch eine public-Variable, aber das macht man nicht.



  • Technisch geht auch noch eine public-Variable, aber das macht man nicht

    Selbiges gilt im Allgemeinen auch für protected Variablen 😉



  • kann es sein, daß du ganz einfach das willst?!?:

    #include <iostream>
    using namespace std;
    
    class Kreis
    {
    private:
    protected:  //geändert
        float kreisflaeche;
    public:
        Kreis(float);
        void out();
    };
    
    Kreis::Kreis(float radius)
    {
        kreisflaeche = 3.14 * radius;
    }
    
    void Kreis::out()
    {
        cout <<kreisflaeche;
    }
    
    class Ring:public Kreis
    {
    private:
        float ringflaeche;
    public:
        Ring(float);
        void out();
    };
    
    Ring::Ring(float radius) : Kreis(radius)
    {
        ringflaeche = kreisflaeche; //geändert
    }
    
    void Ring::out()
    {
        cout <<ringflaeche;
    }
    
    int main()
    { 
        Ring(10);
        k.out();
        return 0;
    }
    

Log in to reply