Übung aus meinem Buch geht nicht



  • Ich habe gerade eine Übung aus meinem C++ Buch gemacht. Dabei ging es um "abstrakte Vererbung". Es wird von der Klasse Animal auf Mammal u. Fish vererbt. Und Mammal unterteilt sich noch einmal in "Dog" und "Horse".

    #include <iostream>
    using namespace std;
    
    enum COLOR {Red,Green,Blue,Yellow,Violet,Black,White,Grey};
    
    class Animal
    {
        public:
        Animal(int age_);
        ~Animal();
        inline int get_age() const {return m_age;}
        virtual void Color(COLOR temp) const = 0;
        virtual void Sleep() const = 0;
        virtual void Eat() const = 0;
        virtual void Reproduce() const = 0;
        virtual void Move() const = 0;
        virtual void Speak() const = 0;
    
        private:
        int m_age;
    };
    
    Animal::Animal(int age_)
    :m_age(age_)
    {
        cout << "ANIMAL Konstruktor\n";
    }
    
    Animal::~Animal()
    {
        cout << "ANIMAL Destruktor\n";
    }
    
    void Animal::Color(COLOR temp) const
    {   // !!! <--???
        switch (temp)
        {
            case Red:
            cout << "Rot\n";
            break;
            case Green:
            cout << "Gr\x81n\n";
            break;
            case Blue:
            cout << "Blau\n";
            break;
            case Yellow:
            cout << "Gelb\n";
            break;
            case Violet:
            cout << "Violett\n";
            break;
            case Black:
            cout << "Schwarz\n";
            break;
            case White:
            cout << "Weiß\n";
            break;
            case Grey:
            cout << "Grau\n";
            break;
        }
    }
    
    class Mammal : public Animal
    {
        public:
        Mammal(int age_i);
        virtual ~Mammal();
        inline void Reproduce() const {cout << "Mammal Fortpflanzung\n";}
    };
    
    Mammal::Mammal(int age_i)
    :Animal(age_i)
    {
        cout << "MAMMAL Konstruktor\n";
    };
    
    Mammal::~Mammal()
    {
        cout << "MAMMAL Destruktor\n";
    }
    
    class Fish : public Animal
    {
        public:
        Fish(int age_i,COLOR color_);
        ~Fish();
        inline void Color() const;
        inline void Sleep() const {cout << "Fisch schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Fisch isst\n";}
        inline void Reproduce() const {cout << "Fisch leg Eier\n";}
        inline void Move() const {cout << "Fisch schwimmt\n";}
        inline void Speak() const {cout << "BLUB_BLUB\n";}
    
        private:
        COLOR m_color;
    };
    
    Fish::Fish(int age_i,COLOR color_)
    :Animal(age_i),m_color(color_)
    {
        cout << "FISH Konstruktor\n";
    };
    
    Fish::~Fish()
    {
        cout << "FISH Destruktor\n";
    }
    
    void Fish::Color() const
    {
        cout << "Der Fisch ist ";
        Animal::Color(m_color);
    }
    
    class Horse : public Mammal
    {
        public:
        Horse(int age_i, COLOR color_);
        ~Horse();
        inline void Speak() const {cout << "Wieher\n";}
        inline void Color() const;
        inline void Sleep() const {cout << "Pferd schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Pferd isst\n";}
        inline void Move() const {cout << "Pferd galoppiert\n";}
    
        private:
        COLOR m_color;
    };
    
    Horse::Horse(int age_i, COLOR color_)
    :Mammal(age_i),m_color(color_)
    {
        cout << "HORSE Konstruktor\n";
    }
    
    Horse::~Horse()
    {
        cout << "HORSE Destruktor\n";
    }
    
    void Horse::Color() const
    {
        cout << "Das Pferd ist ";
        Animal::Color();  //<--  muss das Mammal::Animal::Color() heißen?
    }
    
    class Dog : public Mammal
    {
        public:
        Dog(int age_i,COLOR color_);
        ~Dog();
        inline void Speak() const {cout << "Wuff\n";}
        inline void Sleep() const {cout << "Hund schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Hund isst\n";}
        inline void Move() const {cout << "Hund bewegt sich\n";}
        inline void Color() const;
    
        private:
        COLOR m_color;
    };
    
    Dog::Dog(int age_i,COLOR color_)
    :Mammal(age_i),m_color(color_)
    {
        cout << "DOG Konstruktor\n";
    }
    
    Dog::~Dog()
    {
        cout << "DOG Destruktor\n";
    }
    
    void Dog::Color() const
    {
        cout << "Der Hund ist ";
        Animal::Color(); // <-- genauso wie bei 149
    }
    
    int main()
    {
    
        return 0;
    }
    

    FEHLERMELDUNGEN:

    Compiling: C:\MinGW\Andi\abstrakte_klasse.cpp
    C:\MinGW\Andi\abstrakte_klasse.cpp: In member function void Horse::Color() const': C:\\MinGW\\Andi\\abstrakte_klasse.cpp:149: error: no matching function for call toHorse::Color() const'
    C:\MinGW\Andi\abstrakte_klasse.cpp:35: note: candidates are: virtual void Animal::Color(COLOR) const
    C:\MinGW\Andi\abstrakte_klasse.cpp: In member function void Dog::Color() const': C:\\MinGW\\Andi\\abstrakte_klasse.cpp:183: error: no matching function for call toDog::Color() const'
    C:\MinGW\Andi\abstrakte_klasse.cpp:35: note: candidates are: virtual void Animal::Color(COLOR) const
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 0 warnings



  • Der sagt dir doch was falsch ist: Die Methode Color ohne Parameter existiert nicht, es existiert nur eine Funktion mit dem Parameter COLOR => Du hast den Parameter vergessen.



  • Ach so, mh ich hab das jetzt dementsprechend umgebaut, aber jetzt gibts neue Erros die ich nicht verstehe:

    #include <iostream>
    using namespace std;
    
    enum COLOR {Red,Green,Blue,Yellow,Violet,Black,White,Grey};
    
    class Animal
    {
        public:
        Animal(int age_);
        ~Animal();
        inline int get_age() const {return m_age;}
        virtual void Color(COLOR temp) const = 0;
        virtual void Sleep() const = 0;
        virtual void Eat() const = 0;
        virtual void Reproduce() const = 0;
        virtual void Move() const = 0;
        virtual void Speak() const = 0;
    
        private:
        int m_age;
    };
    
    Animal::Animal(int age_)
    :m_age(age_)
    {
        cout << "ANIMAL Konstruktor\n";
    }
    
    Animal::~Animal()
    {
        cout << "ANIMAL Destruktor\n";
    }
    
    void Animal::Color(COLOR temp) const
    {   
        switch (temp)
        {
            case Red:
            cout << "Rot\n";
            break;
            case Green:
            cout << "Gr\x81n\n";
            break;
            case Blue:
            cout << "Blau\n";
            break;
            case Yellow:
            cout << "Gelb\n";
            break;
            case Violet:
            cout << "Violett\n";
            break;
            case Black:
            cout << "Schwarz\n";
            break;
            case White:
            cout << "Weiß\n";
            break;
            case Grey:
            cout << "Grau\n";
            break;
        }
    }
    
    class Mammal : public Animal
    {
        public:
        Mammal(int age_i);
        virtual ~Mammal();
        inline void Reproduce() const {cout << "Mammal Fortpflanzung\n";}
    };
    
    Mammal::Mammal(int age_i)
    :Animal(age_i)
    {
        cout << "MAMMAL Konstruktor\n";
    };
    
    Mammal::~Mammal()
    {
        cout << "MAMMAL Destruktor\n";
    }
    
    class Fish : public Animal
    {
        public:
        Fish(int age_i,COLOR color_);
        ~Fish();
        inline void Color() const;
        inline void Sleep() const {cout << "Fisch schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Fisch isst\n";}
        inline void Reproduce() const {cout << "Fisch leg Eier\n";}
        inline void Move() const {cout << "Fisch schwimmt\n";}
        inline void Speak() const {cout << "BLUB_BLUB\n";}
    
        private:
        COLOR m_color;
    };
    
    Fish::Fish(int age_i,COLOR color_)
    :Animal(age_i),m_color(color_)
    {
        cout << "FISH Konstruktor\n";
    };
    
    Fish::~Fish()
    {
        cout << "FISH Destruktor\n";
    }
    
    void Fish::Color() const
    {
        cout << "Der Fisch ist ";
        Animal::Color(m_color);
    }
    
    class Horse : public Mammal
    {
        public:
        Horse(int age_i, COLOR color_);
        ~Horse();
        inline void Speak() const {cout << "Wieher\n";}
        inline void Color(COLOR temp) const;
        inline void Sleep() const {cout << "Pferd schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Pferd isst\n";}
        inline void Move() const {cout << "Pferd galoppiert\n";}
    
        private:
        COLOR m_color;
    };
    
    Horse::Horse(int age_i, COLOR color_)
    :Mammal(age_i),m_color(color_)
    {
        cout << "HORSE Konstruktor\n";
    }
    
    Horse::~Horse()
    {
        cout << "HORSE Destruktor\n";
    }
    
    void Horse::Color(COLOR temp=m_color) const
    {
        cout << "Das Pferd ist ";
        Animal::Color(temp);  
    }
    
    class Dog : public Mammal
    {
        public:
        Dog(int age_i,COLOR color_);
        ~Dog();
        inline void Speak() const {cout << "Wuff\n";}
        inline void Sleep() const {cout << "Hund schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Hund isst\n";}
        inline void Move() const {cout << "Hund bewegt sich\n";}
        inline void Color(COLOR temp) const;
    
        private:
        COLOR m_color;
    };
    
    Dog::Dog(int age_i,COLOR color_)
    :Mammal(age_i),m_color(color_)
    {
        cout << "DOG Konstruktor\n";
    }
    
    Dog::~Dog()
    {
        cout << "DOG Destruktor\n";
    }
    
    void Dog::Color(COLOR temp=m_color) const
    {
        cout << "Der Hund ist ";
        Animal::Color(temp); 
    }
    
    int main()
    {
    
        return 0;
    }
    

    ERROR's

    Compiling: C:\MinGW\Andi\abstrakte_klasse.cpp
    C:\MinGW\Andi\abstrakte_klasse.cpp:131: error: invalid use of non-static data member Horse::m\_color' C:\\MinGW\\Andi\\abstrakte_klasse.cpp:146: error: from this location C:\\MinGW\\Andi\\abstrakte\_klasse.cpp:166: error: invalid use of non-static data memberDog::m_color'
    C:\MinGW\Andi\abstrakte_klasse.cpp:180: error: from this location
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 0 warnings

    MfG
    Stromberg



  • void Dog::Color(COLOR temp=m_color) const
    

    Ich würde mal wagen zu behaupten, dass das nicht geht Oo



  • glaube rüdiger meinte zu recht

    Animal::Color(m_color);
    

    statt

    Animal::Color();
    

    mfg spjoe



  • Mh, warum nicht? Das ist doch n ganz normaler default paramter oder?

    MfG
    Stromberg



  • das schon, aber m_color ist ein nicht-statischer member derselben klasse. der wird zwar beim methodenaufruf verfügbar sein, aber nicht im methodenkopf.



  • Sry, ich hab nicht so die Ahnung von "static", was genau heißt das? Das ist doch irgendwie so, das ich "static" Sachen auch außerhalb der Klasse aufrufen kann? Oder was macht "static" genau für mich? Ich hab jetzt auch beide Elementvariablen als "static" deklariert. Weil der Compilrer wollte die ja anscheinend "static". So jetzt gibts aber immer noch 2 Errors:

    #include <iostream>
    using namespace std;
    
    enum COLOR {Red,Green,Blue,Yellow,Violet,Black,White,Grey};
    
    class Animal
    {
        public:
        Animal(int age_);
        ~Animal();
        inline int get_age() const {return m_age;}
        virtual void Color(COLOR temp) const = 0;
        virtual void Sleep() const = 0;
        virtual void Eat() const = 0;
        virtual void Reproduce() const = 0;
        virtual void Move() const = 0;
        virtual void Speak() const = 0;
    
        private:
        int m_age;
    };
    
    Animal::Animal(int age_)
    :m_age(age_)
    {
        cout << "ANIMAL Konstruktor\n";
    }
    
    Animal::~Animal()
    {
        cout << "ANIMAL Destruktor\n";
    }
    
    void Animal::Color(COLOR temp) const
    {   // !!! <--???
        switch (temp)
        {
            case Red:
            cout << "Rot\n";
            break;
            case Green:
            cout << "Gr\x81n\n";
            break;
            case Blue:
            cout << "Blau\n";
            break;
            case Yellow:
            cout << "Gelb\n";
            break;
            case Violet:
            cout << "Violett\n";
            break;
            case Black:
            cout << "Schwarz\n";
            break;
            case White:
            cout << "Weiß\n";
            break;
            case Grey:
            cout << "Grau\n";
            break;
        }
    }
    
    class Mammal : public Animal
    {
        public:
        Mammal(int age_i);
        virtual ~Mammal();
        inline void Reproduce() const {cout << "Mammal Fortpflanzung\n";}
    };
    
    Mammal::Mammal(int age_i)
    :Animal(age_i)
    {
        cout << "MAMMAL Konstruktor\n";
    };
    
    Mammal::~Mammal()
    {
        cout << "MAMMAL Destruktor\n";
    }
    
    class Fish : public Animal
    {
        public:
        Fish(int age_i,COLOR color_);
        ~Fish();
        inline void Color() const;
        inline void Sleep() const {cout << "Fisch schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Fisch isst\n";}
        inline void Reproduce() const {cout << "Fisch leg Eier\n";}
        inline void Move() const {cout << "Fisch schwimmt\n";}
        inline void Speak() const {cout << "BLUB_BLUB\n";}
    
        private:
        COLOR m_color;
    };
    
    Fish::Fish(int age_i,COLOR color_)
    :Animal(age_i),m_color(color_)
    {
        cout << "FISH Konstruktor\n";
    };
    
    Fish::~Fish()
    {
        cout << "FISH Destruktor\n";
    }
    
    void Fish::Color() const
    {
        cout << "Der Fisch ist ";
        Animal::Color(m_color);
    }
    
    class Horse : public Mammal
    {
        public:
        Horse(int age_i, COLOR color_);
        ~Horse();
        inline void Speak() const {cout << "Wieher\n";}
        inline void Color(COLOR temp) const;
        inline void Sleep() const {cout << "Pferd schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Pferd isst\n";}
        inline void Move() const {cout << "Pferd galoppiert\n";}
    
        private:
        static COLOR m_color;
    };
    
    Horse::Horse(int age_i, COLOR color_)
    :Mammal(age_i),m_color(color_)
    {
        cout << "HORSE Konstruktor\n";
    }
    
    Horse::~Horse()
    {
        cout << "HORSE Destruktor\n";
    }
    
    void Horse::Color(COLOR temp=m_color) const
    {
        cout << "Das Pferd ist ";
        Animal::Color(temp);  //<--  muss das Mammal::Animal::Color() heißen?
    }
    
    class Dog : public Mammal
    {
        public:
        Dog(int age_i,COLOR color_);
        ~Dog();
        inline void Speak() const {cout << "Wuff\n";}
        inline void Sleep() const {cout << "Hund schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Hund isst\n";}
        inline void Move() const {cout << "Hund bewegt sich\n";}
        inline void Color(COLOR temp) const;
    
        private:
        static COLOR m_color;
    };
    
    Dog::Dog(int age_i,COLOR color_)
    :Mammal(age_i),m_color(color_)
    {
        cout << "DOG Konstruktor\n";
    }
    
    Dog::~Dog()
    {
        cout << "DOG Destruktor\n";
    }
    
    void Dog::Color(COLOR temp=m_color) const
    {
        cout << "Der Hund ist ";
        Animal::Color(temp); // <-- genauso wie bei 149
    }
    
    int main()
    {
    
        return 0;
    }
    

    ERRORS:

    Compiling: C:\MinGW\Andi\abstrakte_klasse.cpp
    C:\MinGW\Andi\abstrakte_klasse.cpp: In constructor Horse::Horse(int, COLOR)': C:\\MinGW\\Andi\\abstrakte\_klasse.cpp:136: error:COLOR Horse::m_color' is a static data member; it can only be initialized at its definition
    C:\MinGW\Andi\abstrakte_klasse.cpp: In constructor Dog::Dog(int, COLOR)': C:\\MinGW\\Andi\\abstrakte\_klasse.cpp:170: error:COLOR Dog::m_color' is a static data member; it can only be initialized at its definition
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 0 warnings

    MfG
    Stromberg



  • du kannst mit einem statischen datamember keine elementvariablen nachbilden. der sinn hinter m_color ist ja wohl, das jedes objekt (tier) seine eigene farbe hat, oder? oder willst du, dass nur fische eine farbe haben? dann weg mit dem "Color" aus Animal. aber ich glaube eher, du willst sowas:

    class Animal
    {
    //...
    void Color () const; //weg mit dem "temp"
    //...
    private:
      Color m_color; //und m_color hier einfügen.
    };
    
    void Animal::Color () const //hier ebenso
    {
      switch (m_color)
      //...
    }
    
    //und irgendwo aufrufen
    Fisch f;
    f.Color();
    

    aber ohne genau zu wissen, was du mit "Color" überhaupt bezwecken willst, kann man dir nicht weiter helfen.

    und zu static solltest du dir noch mehr durchlesen, und vor allem: es nicht einfach verwenden, wenn du nicht weißt, was es bewirkt.



  • Ich wollte eigentlich das jedes Tier seine eigene Farbe hat. Aber was mir halt wichtig war, war das die Farbe automatisch erkannt wird, also das hier:

    switch (temp)
        {
            case Red:
            cout << "Rot\n";
            break;
            case Green:
            cout << "Gr\x81n\n";
            break;
            case Blue:
            cout << "Blau\n";
            break;
            case Yellow:
            cout << "Gelb\n";
            break;
            case Violet:
            cout << "Violett\n";
            break;
            case Black:
            cout << "Schwarz\n";
            break;
            case White:
            cout << "Weiß\n";
            break;
            case Grey:
            cout << "Grau\n";
            break;
        }
    

    das ich da halt gleich eine Funktion habe mit der ich die Farbe aufrufen kann. Und diese Methode wollte ich halt irgendwie in Animal implementieren, sodass ich nicht in jeder einzelnen "Color()" Methode in "Fish","Horse" und "Dog" den gleichen Code 3 mal habe.....kann mir jemand folgen? 😃
    Und darum wollt ich das dann irgendwie über die Methode Animal::Color() machen, weil ich in meinem C++ Buch gelesen habe, wenn man für viele Methode die gleiche Funktion braucht kann man für sowas einfach immer Klasse:: + die Redefinierte Methode nehmen, und in dieser seine Funktion definieren..und so ganz einfach bei allen aufrufen. Aber irgendwie hab ich nicht mitgedacht, dass wenn ich in der abstrakten Methode einen Parameter hinzufüge, das der natürlich auch in der redefinierten sein muss. Mh..wie kann ich jetzt meinen Code so machen das er funktioniert? Er funzt ja shcon fast.
    Und wie würdet ihr das umsetzen? (wenn ihrs verstanden habt was ich möcht... :D)

    MfG
    Stromberg



  • ok, ich versuch mal, dir zu helfen.

    1. jedes *einzelne* tier (jede instanz) hat seine eigene farbe.also ist farbe eine eigenschaft von jedem tier.

    class Animal
    {
       Color color;
    };
    

    2. ein tier hat von anfang an eine farbe. konstruktor verwenden:

    class Animal
    {
      Color color_;
    
    public:
      Animal (Color color) : color_(c) {}
    };
    

    3. du willst, dass jedes tier "sagen kann", welche farbe es hat

    class Animal
    {
      Color color_;
    
    public:
      Animal (Color color) : color_(c) {}
    
      void print_color () const
      {
         switch (color_)
         { 
          //den code kennst du
         }
      }
    };
    

    so, und jetzt testen wir das ganze mal mit nem hund und ner katze

    class Dog : public Animal
    {
    public:
      Dog () : Animal(Yellow) {} //alle hunde sollen gelb sein
    };
    
    class Cat : public Animal
    {
    public:
      Cat (Color color) : Animal(color) {} //katzen sind individuell verschieden
    }
    
    int main ()
    {
       Dog snoopy;
       snoopy.print_color();
    
       Dog brian;
       brian.print_color();
    
       Cat garfield(Orange);
       garfield.print_color();
    
       Cat snowball(Black);
       snowball.print_color();
    }
    

    das ist wohl das einfachste minimal-beispiel.

    und jetzt frage ich dich, was deine verschlungenen sätze bedeuten 😉

    das ich da halt gleich eine Funktion habe mit der ich die Farbe aufrufen kann.

    was heißt "eine Farbe aufrufen"? was erwartest du, wenn du "eine farbe aufrufst"? du kannst eine funktion aufrufen, die dir die farbe ausgibt, meinst du das? du könntest meinen: eine funktion, die die farbe des tieres setzt. meinst du das?

    Und diese Methode wollte ich halt irgendwie in Animal implementieren, sodass ich nicht in jeder einzelnen "Color()" Methode in "Fish","Horse" und "Dog" den gleichen Code 3 mal habe.....kann mir jemand folgen? 😃

    klar, du lagerst den code in die basisklasse aus, weil "color" eine eigenschaft ist, die _alle_ tiere (Animal) haben.

    [quote]
    Und darum wollt ich das dann irgendwie über die Methode Animal::Color() machen, weil ich in meinem C++ Buch gelesen habe, wenn man für viele Methode die gleiche Funktion braucht kann man für sowas einfach immer Klasse:: + die Redefinierte Methode nehmen, und in dieser seine Funktion definieren..
    [quote]
    eine methode... IST eine funktion!
    was bedeutet "wenn man für viele methode die gleiche funktion braucht"? was ist eine "redefinierte methode"? was meinst du, wenn du sagst: "man kann eine redefinierte methode nehmen?" was meinst du mit "man kann eine methode nehmen und in dieser seine funktion definieren"?

    und so ganz einfach bei allen aufrufen. Aber irgendwie hab ich nicht mitgedacht, dass wenn ich in der abstrakten Methode einen Parameter hinzufüge, das der natürlich auch in der redefinierten sein muss.

    ich befürchte, du meinst mit "redefinierte methode" einfach den aufruf der funktion über eine instanz einer abgeleiteten klasse. lass dir das auf der zunge zergehen 😉

    die methode in Animal darf einfach nicht abstrakt sein. sie muss nicht mal virtual sein. du hast trotzdem zugriff darauf. außerdem: wozu braucht sie einen parameter? color ist ja eigenschaft des objekts, wozu übergibst du der print-methode dann also nochmal eine farbe?



  • So, also ich hab jetzt nochmal alles überdacht, und wie du gesagt hast, hab ich die Elementvariable "COLOR color" gleich in Animal...weil jedes Tier hat ja eine Farbe...
    Hier mal der Code:

    #include <iostream>
    using namespace std;
    
    enum COLOR {Red,Green,Blue,Yellow,Violet,Black,White,Grey};
    
    class Animal
    {
        public:
        Animal(int age_,COLOR color_);
        virtual ~Animal();
        inline int get_age() const {return m_age;}
        virtual void Color() const = 0;
        virtual void Sleep() const = 0;
        virtual void Eat() const = 0;
        virtual void Reproduce() const = 0;
        virtual void Move() const = 0;
        virtual void Speak() const = 0;
    
        private:
        int m_age;
        COLOR m_color;
    };
    
    Animal::Animal(int age_,COLOR color_)
    :m_age(age_),m_color(color_)
    {
        cout << "ANIMAL Konstruktor\n";
    }
    
    Animal::~Animal()
    {
        cout << "ANIMAL Destruktor\n";
    }
    
    void Animal::Color() const
    {
        switch (m_color)
        {
            case Red:
            cout << "Rot\n";
            break;
            case Green:
            cout << "Gr\x81n\n";
            break;
            case Blue:
            cout << "Blau\n";
            break;
            case Yellow:
            cout << "Gelb\n";
            break;
            case Violet:
            cout << "Violett\n";
            break;
            case Black:
            cout << "Schwarz\n";
            break;
            case White:
            cout << "Wei\xe1\n";
            break;
            case Grey:
            cout << "Grau\n";
            break;
        }
    }
    
    class Mammal : public Animal
    {
        public:
        Mammal(int age_i,COLOR color_i);
        virtual ~Mammal();
        inline void Reproduce() const {cout << "Mammal Fortpflanzung\n";}
    };
    
    Mammal::Mammal(int age_i,COLOR color_i)
    :Animal(age_i,color_i)
    {
        cout << "MAMMAL Konstruktor\n";
    };
    
    Mammal::~Mammal()
    {
        cout << "MAMMAL Destruktor\n";
    }
    
    class Fish : public Animal
    {
        public:
        Fish(int age_i,COLOR color_i);
        ~Fish();
        inline void Color() const;
        inline void Sleep() const {cout << "Fisch schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Fisch isst\n";}
        inline void Reproduce() const {cout << "Fisch leg Eier\n";}
        inline void Move() const {cout << "Fisch schwimmt\n";}
        inline void Speak() const {cout << "BLUB_BLUB\n";}
    
    };
    
    Fish::Fish(int age_i,COLOR color_i)
    :Animal(age_i,color_i)
    {
        cout << "FISH Konstruktor\n";
    }
    
    Fish::~Fish()
    {
        cout << "FISH Destruktor\n";
    }
    
    void Fish::Color() const
    {
        cout << "Der Fisch ist ";
        Animal::Color();
    }
    
    class Horse : public Mammal
    {
        public:
        Horse(int age_i, COLOR color_i);
        ~Horse();
        inline void Color() const;
        inline void Speak() const {cout << "Wieher\n";}
        inline void Sleep() const {cout << "Pferd schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Pferd isst\n";}
        inline void Move() const {cout << "Pferd galoppiert\n";}
    
    };
    
    Horse::Horse(int age_i, COLOR color_i)
    :Mammal(age_i,color_i)
    {
        cout << "HORSE Konstruktor\n";
    }
    
    Horse::~Horse()
    {
        cout << "HORSE Destruktor\n";
    }
    
    void Horse::Color() const
    {
        cout << "Das Pferd ist ";
        Animal::Color();
    }
    
    class Dog : public Mammal
    {
        public:
        Dog(int age_i,COLOR color_i);
        ~Dog();
        inline void Color() const;
        inline void Speak() const {cout << "Wuff\n";}
        inline void Sleep() const {cout << "Hund schl" << "\x84" << "ft\n";}
        inline void Eat() const {cout << "Hund isst\n";}
        inline void Move() const {cout << "Hund bewegt sich\n";}
    
    };
    
    Dog::Dog(int age_i,COLOR color_i)
    :Mammal(age_i,color_i)
    {
        cout << "DOG Konstruktor\n";
    }
    
    Dog::~Dog()
    {
        cout << "DOG Destruktor\n";
    }
    
    void Dog::Color() const
    {
        cout << "Der Fisch ist ";
        Animal::Color();
    }
    
    int main()
    {
        short choice;
        Animal *temp;
        bool quit=false;
        while(1)
        {
            cout << "1. <- Fisch    2. <- Pferd    3. <- Hund    0 = Beenden\n";
            cin >> choice;
            switch(choice)
            {
                case 1:
                temp=new Fish(14,Black);
                break;
                case 2:
                temp=new Horse(6,White);
                break;
                case 3:
                temp=new Dog(9,Grey);
                break;
                case 0:
                quit=true;
                break;
            }
            if (quit) break;
            temp->Speak();
            temp->Sleep();
            temp->Move();
            temp->Eat();
            temp->Reproduce();
            temp->Color();
            cout << temp->get_age() << endl;
            delete temp;
            cout << "\n\n\n";
        }
    
        return 0;
    }
    

    So passt er aber doch jetzt oder hättest du was anderst gemacht?
    Was kann man den noch verbessern?

    MfG
    Stromberg



  • super erstmal, so funktioniert es so, wie du wolltest 🙂

    Stromberg schrieb:

    So passt er aber doch jetzt oder hättest du was anderst gemacht?
    Was kann man den noch verbessern?

    verbessern kann man immer 😉

    das wichtigste, was ins auge sticht: du musst den destruktor ebenfalls virtuell machen. sonst gibt's probleme, wenn du eines der tiere mit delete löschst.

    ich würde Color eher so implementieren, wie get_age, weil age und color ähnlich funktionieren. aber ich habe keine ahnung, was du weiter mit deinen klassen anstellen willst.



  • Mit der Klasse will ich eigentlich nichts mehr machen, wie schon gesagt es war nur eine "übung" aus meinem Buch. Ich glaub mit der Klasse kann ich au nicht viel machen, höchstens nen Zoo imitieren^^, und darauf hab ich grad net so lust. 😃 Ich mach lieber mit Kapitel 19 von meinem Buch weiter.
    Danke nochmal für die Hilfe.

    MfG
    Stromberg


Log in to reply