Probleme bei Konstruktoraufruf in der Unterklasse



  • Könnt Ihr euch mal meinen Konstruktoraufruf der Klasse Libelle anschauen. Irgendwas klappt da vorne und hinten nicht. Wäre toll wenn mir jemand schreiben kann wie es richtig lauten muss. Wenn mir das dann jemand auch noch erklären kann wäre das Super. Irgendwie kappier ich das glaube ich noch nnicht so ganz.

    Ziel des ganzen ist es aus der Klasse Tier die Unterklasse Libelle abzuleiten. Die Flügellänge soll bei der Methode Essen() ebenfalls um +1 erhöht werden. Bei der Methode Ausgabe() der Unterklasse Libelle soll zusätzlich zum Gewicht und der Länge noch die Flügellänge ausgegebn werden.

    #include <iostream.h>
    class Tier{
            protected:
            int laenge;
            int gewicht;
    
            public:
            Tier(int, int);
            virtual void Essen();
            virtual void Ausgabe();
    };
    
    class Libelle:public Tier{
            private:
            Tier Allgemein;
            int fluegellaenge;
    
            public:
            Libelle(int, Tier);
            void Essen();
            void Ausgabe();
    };
    
    Tier::Tier(int l, int g){
            laenge=l;
            gewicht=g;
    }
    
    void Tier::Essen(){
            laenge++;
            gewicht++;
    }
    
    void Tier::Ausgabe(){
            cout<<"Dieses Tier ist "<<laenge<< " cm lang"<<endl;
            cout<<"und "<<gewicht<<"g schwer"<<endl;
    }
    
    // Der Konstruktoraufruf ist irgendwie komplett falsch. Hat jemand dazu ne Idee?
    Libelle::Libelle(int f,Tier i):Tier(f),Allgemein(i){}
    
    void Libelle::Essen(){
            fluegellaenge++;
    }
    
    void Libelle::Ausgabe(){
            Tier.Ausgabe();
            cout<<"Die Fluegellaenge betraegt "<<fluegellaenge<< " cm.";
    }
    
    void main(){
            Tier Haupttier(5,6);
            Libelle Willi(7,8,9);
    
            Tier *Insektenliste[2];
            Insektenliste[0]=&Haupttier;
            Insektenliste[1]=&Willi;
            Insektenliste[0]->Essen();
            Insektenliste[0]->Ausgabe();
            Insektenliste[1]->Essen();
            Insektenliste[1]->Ausgabe();
    
            char c[50];
            cin.getline(c,50);
    }
    

    Freu mich über jeglich Hilfe und Tipps.



  • Hallo

    was ich nicht so ganz verstehe, ist

    class Libelle:public Tier{
            private:
            Tier Allgemein;
    

    Soll Libelle von Tier abgeleitet sein (erste Zeile, das willst du wahrscheinlich)
    oder soll Libelle ein Member-Objekt namens Allgemein vom Typ Tier haben?
    Ich denke das Allgemein solltest du entfernen.

    bis bald
    akari



  • #include <iostream.h> 
    class Tier{ 
            protected: 
            int laenge; 
            int gewicht; 
    
            public: 
            Tier(int, int); 
            virtual void Essen(); 
            virtual void Ausgabe(); 
    }; 
    
    class Libelle:public Tier{ 
            private: 
            Tier Allgemein;     // gehört hier nicht hin, du willst nur ableiten, vermute ich
            int fluegellaenge; 
    
            public: 
            Libelle(int, Tier); // der konstruktor muss drei mal int übernehmen
            void Essen();       // ist auch virtual, würde ich kennzeichnen
            void Ausgabe();     // ebenso
    }; 
    
    Tier::Tier(int l, int g){ // auch hier mit konstruktor-initialisierungs-liste arbeiten (: laenge(l), gewicht(g)
            laenge=l; 
            gewicht=g; 
    } 
    
    void Tier::Essen(){ 
            laenge++; 
            gewicht++; 
    } 
    
    void Tier::Ausgabe(){ 
            cout<<"Dieses Tier ist "<<laenge<< " cm lang"<<endl; 
            cout<<"und "<<gewicht<<"g schwer"<<endl; 
    } 
    
    //  Das muss so aussehen
    Libelle::Libelle(int f,int l, int g) : 
        fluegellaenge(f),
        Tier(l, g)
    {}
    
    /*
    Libelle::Libelle(int f,Tier i):Tier(f),Allgemein(i){} 
    */
    
    void Libelle::Essen(){ 
            fluegellaenge++; 
    } 
    
    void Libelle::Ausgabe(){ 
            Tier.Ausgabe(); 
            cout<<"Die Fluegellaenge betraegt "<<fluegellaenge<< " cm."; 
    } 
    
    void main(){ 
            Tier Haupttier(5,6); 
            Libelle Willi(7,8,9); 
    
            Tier *Insektenliste[2]; 
            Insektenliste[0]=&Haupttier; 
            Insektenliste[1]=&Willi; 
            Insektenliste[0]->Essen(); 
            Insektenliste[0]->Ausgabe(); 
            Insektenliste[1]->Essen(); 
            Insektenliste[1]->Ausgabe(); 
    
            char c[50]; 
            cin.getline(c,50); 
    }
    


  • Ich glaube das ist eher was du meinst:

    class Libelle : public Tier
    {
    private:
      //Tier Allgemein; // <--- deine Libelle ist bereits ein Tier
      int fluegellaenge;
    
    public:
      //Libelle(int, Tier); // <--- Parameternamen erhoehen die Lesbarkeit
      Libelle(int la, int ge, int fl);
      void Essen();
      void Ausgabe();
    };
    
    // ...
    
    Libelle::Libelle(int la, int ge, int fl)
      : Tier(la, ge),
        fluegellaenge(fl)
    { }
    


  • Hier mein Momentaner Code. Danke erstmal für die bisherige Hilfe.

    Jetzt hab ich das Problem das bei der Methode Essen() der Unterklasse Libelle nicht auch automatisch das Gewicht und die Laenge zunimmt. das wollte ich gerne erreichen indem die Funktion essen() für die Klasse Tier automatisch mit aufgerufen wird. Das gleich gilt für die Ausgabe. Es soll erst die Ausgabefunktion von Tier aufgerufen werden. Da ist das Gewicht und die länge ja schon drin. Und dann nur noch die Flügellänge aus der Klasse Libelle ausgegeben werden.

    Danke schonmal für eure Hilfe.

    #include <iostream.h>
    class Tier{
            protected:
            int laenge;
            int gewicht;
    
            public:
            Tier(int, int);
            virtual void Essen();
            virtual void Ausgabe();
    };
    
    class Libelle:public Tier{
            private:
            int fluegellaenge;
    
            public:
            Libelle(int la, int ge, int fl);
            void Essen();
            void Ausgabe();
    };
    
    Tier::Tier(int l, int g){
            laenge=l;
            gewicht=g;
    }
    
    void Tier::Essen(){
            laenge++;
            gewicht++;
    }
    
    void Tier::Ausgabe(){
            cout<<"Dieses Tier ist "<<laenge<< " cm lang"<<endl;
            cout<<"und "<<gewicht<<"g schwer"<<endl; 
    } 
    
    // Der Konstruktoraufruf ist irgendwie komplett falsch. Hat jemand dazu ne Idee?
    Libelle::Libelle(int la, int ge, int fl):Tier(la, ge),fluegellaenge(fl){}
    
    void Libelle::Essen(){ 
            fluegellaenge++; 
    }
    
    void Libelle::Ausgabe(){
            Ausgabe();
            cout<<"Die Fluegellaenge betraegt "<<fluegellaenge<< " cm."; 
    } 
    
    void main(){
            Tier Haupttier(5,6); 
            Libelle Willi(7,8,9);
    
            Tier *Insektenliste[2]; 
            Insektenliste[0]=&Haupttier;
            Insektenliste[1]=&Willi; 
            Insektenliste[0]->Essen();
            Insektenliste[0]->Ausgabe(); 
            Insektenliste[1]->Essen(); 
            Insektenliste[1]->Ausgabe();
    
            char c[50]; 
            cin.getline(c,50); 
    }
    


  • void Libelle::Essen(){
      Tier::Essen(); // <----
      fluegellaenge++;
    }
    

    Davon ab:

    //#include <iostream.h> // <--- so nicht sondern:
    #include <iostream>
    using namespace std;
    
    // ...
    
    //void main() // <--- niemals void, sondern
    int main()
    

    schau mal in die FAQ weshalb.

    p.s. es gibt neben den {code} Tags auch explizit {cpp} 😉



  • Danke für eure tolle Unterstützung.

    Läuft jetzt so wie ich es wollte. Ich glaub jetzt hab ichs auch verstanden.

    MFG

    Mr.Blond


Anmelden zum Antworten