Vererbungsproblem



  • warum in public aendern ?



  • Da ich in Gorilla.cpp und Schimpanse.cpp auf den Namen zugreifen muss, dass du jedoch ja nicht wissen konntest.

    Wollte nun noch die Affenart sprich Schimpanse und Gorilla hinzufügen. Hänge aber wieder an einem Problem 😕

    Dachte man kann es so machen aber dann kommt der Fehler "multipleinitalizations"

    #ifndef AFFE_H
    #define AFFE_H
    #include <string>
    #include <iostream>
    using namespace std;
    
    class Affe
    {
    public:
        Affe(const string &n, const string &a);
        const string getname() const;
        const string getart() const;
        void essen() const;
        void sitzen() const;
        string name;
        string art;
    };
    
    #endif // AFFE_H
    
    #include <QCoreApplication>
    #include <string>
    #include "affe.h"
    #include "schimpanse.h"
    #include "gorilla.h"
    #include "affenforscherin.h"
    using namespace std;
    
    int main()
    {
        Affe Ursus ("Ursus", "Affe");
        Schimpanse Tschita ("Tschita", "Schimpanse");
        Gorilla George ("George", "Gorilla");
    
        Ursus.sitzen();
        Ursus.essen();
        Tschita.hangelt();
        Tschita.essen();
        George.trommelt();
        George.essen();
    
        return 0;
    }
    


  • Du wolltest das aber nur mitteilen und den Fehler selber beheben, da du ja weder die exakte Fehlermeldung noch den Code, der dazu führt, zeigst?



  • Chris9090 schrieb:

    Da ich in Gorilla.cpp und Schimpanse.cpp auf den Namen zugreifen muss, dass du jedoch ja nicht wissen konntest.

    Das ist keine Erklärung, denn der getter war auch vorher public.

    int main()
    {
        Affe Ursus ("Ursus", "Affe");
        Schimpanse Tschita ("Tschita", "Schimpanse");
        Gorilla George ("George", "Gorilla");
    

    Du hast die Art jetzt irgendwie doppelt drin, einmal als zusätzlichen String und dann noch als Typ. Das erscheint mir wenig sinnvoll.



  • Dachte man kann dies irgendwie so lösen, aber in dem Fall bin ich auf dem völlig flschen weg :/:/

    Ich stell euch vllt am besten mal meine Aufgabenstellung rein vllt. könnt ihr es dann am besten nachvollziehen.

    Aufgabe 2: Okongo III
    Die Affenforscherin "Besine Gadegas" wandert durch den Dschungel am Fluss Okongo, um das Verhalten unterschiedlicher Affenarten zu erforschen. Immer, wenn sie den Schimpansen "Tschita" oder den Gorilla "George" besucht, vollführt dieser sein typisches Verhaltensmuster und isst danach eine Banane. Implementieren Sie die Besuchssituation auf der Grundlage Ihrer Lösung der ersten Dschungelaufgabe vom letzten Übungsblatt in der folgenden Weise:
    Legen Sie ein neues Projekt an. Kopieren Sie in dessen Verzeichnis die Dateien der unterschiedlichen Affen aus der Aufgabe Okongo II des letzten Übungsblatts. Importieren Sie danach diese Dateien in das neue Projekt. Unter QtCreator geschieht das Importieren durch Rechtsklick auf den Projektnamen und Aufruf des Befehls Existierende Datei hinzufügen.
    Führen Sie dann die im Folgenden beschriebenen Ergänzungen am Projekt durch. In diesem Zusammenhang sind auch Änderungen an den kopierten Dateien erforderlich.
    Definieren Sie eine Klasse Affenforscherin, die über eine Methode für das Besuchen von Affen verfügt:

    void besucht(Affe &a)
    

    Affenforscherinnen besitzen einen Namen.
    Rufen Sie alle Methoden, die Handlungen der Affen betreffen, in der Methode besucht() auf und nutzen Sie dabei die dynamische Polymorphie aus.
    Affen können nun zusätzlich mit Hilfe einer Methode string werBinIch() Auskunft über ihre Art geben.

    Schreiben Sie eine main(...)-Funktion, in der die Forscherin besine den Affen ursus, den Schimpansen tschita und den Gorilla george besucht. Alle Ausgaben auf die Konsole finden in den Klassen der Affenforscherin und der Affenarten und nicht in der main(...)-Funktion statt.

    Ausgabe des Programms:
    Besine besucht den Affen Ursus
    Ursus sitzt herum
    Ursus isst eine Banane
    Besine besucht den Schimpansen Tschita
    Tschita hangelt
    Tschita isst eine Banane
    Besine besucht den Gorilla George
    George trommelt
    George isst eine Banane



  • Kann mir niemand helfen?



  • Doch, wir könnten dir schon helfen und tun das auch gern, aber wir lösen nicht deine Hausaufgaben vollständig. Zumal es dafür auch einfacher wäre, wenn wir den gesamten Quelltext hätten.

    Bevor du aber alles postest, versuche doch das Problem selbst zu lösen. Wenn es nicht geht, dann mach ein minimales (!) vollständiges (!) Beispiel, an dem du das Problem beschreibst.

    Ansonsten vermute ich, dass die Aufgaben irgendwann auf das visitor-Pattern hinauslaufen sollen.



  • Ok danke war wirklich zu viel verlangt von mir.
    Aber keine Sorge es sind nicht meine Hausaufgaben 😛

    Also mein Problem ist ja nicht die ganze Aufgabenstellung. Mein Problem besteht darin die Affenart hinzuzufügen. Ich hab über den Konstruktor ja bereits jedem Affen einen Namen hinzugefügt und nun wollte ich dahinter noch die Affenart hinzufügen was so jedoch leider nicht klappt 😞

    In der Aufgabenstellung steht, dass ich dazu eine Methode verwenden soll, ich weiß jedoch leider nicht wie ich das anstellen soll?



  • manni66 schrieb:

    Du wolltest das aber nur mitteilen und den Fehler selber beheben, da du ja weder die exakte Fehlermeldung noch den Code, der dazu führt, zeigst?



  • Aso sorry wenn ich mich missverständlich ausgedrückt habe.

    Ich wollte die Affenart hinzufügen aber dann kommt die Fehlermeldung "multiple initializiations given for base Affe" und "no matching function for callto Affe::Affe(const string &)"

    Und nun die Frage ob das in meinem Code die komplett falsche herangehensweise ist, oder ob ich darin nur einen Fehler begangen habe?

    Vielen Dank für eure Hilfe und sry für meine missverständliche Frage.

    main.cpp

    #include <QCoreApplication>
    #include <string>
    #include "affe.h"
    #include "schimpanse.h"
    #include "gorilla.h"
    #include "affenforscherin.h"
    using namespace std;
    
    int main()
    {
        Affe Ursus ("Ursus", "Affe");
        Schimpanse Tschita ("Tschita", "Schimpanse");
        Gorilla George ("George", "Gorilla");
    
        Ursus.sitzen();
        Ursus.essen();
        Tschita.hangelt();
        Tschita.essen();
        George.trommelt();
        George.essen();
    
        return 0;
    }
    

    affe.h

    #ifndef AFFE_H
    #define AFFE_H
    #include <string>
    #include <iostream>
    using namespace std;
    
    class Affe
    {
    public:
        Affe(const string &n, const string &a);
        const string getname() const;
        const string getart() const;
        void essen() const;
        void sitzen() const;
        string name;
        string art;
    };
    
    #endif // AFFE_H
    

    affe.cpp

    #include "affe.h"
    #include <string>
    #include <iostream>
    using namespace std;
    
    Affe::Affe(const string &n, const string &a) : name(n), art(a)
    {
    }
    
    const string Affe::getname() const{
        return name;
    }
    
    const string Affe::getart() const{
        return art;
    }
    
    void Affe::essen()const{
        cout << name << " isst eine Banane" << endl;
    }
    
    void Affe::sitzen()const{
        cout << name << " sitzt herum" << endl;
    }
    

    gorilla.h

    #ifndef GORILLA_H
    #define GORILLA_H
    #include "affe.h"
    
    class Gorilla : public Affe
    {
    public:
        Gorilla(const string &n, const string &a);
        void trommelt() const;
    };
    
    #endif // GORILLA_H
    

    gorilla.cpp

    #include "gorilla.h"
    #include <string>
    #include <iostream>
    using namespace std;
    
    Gorilla::Gorilla(const string &n, const string &a) : Affe(n), Affe(a)
    {
    }
    
    void Gorilla::trommelt() const{
        cout << name << " trommelt" << endl;
    }
    

    schimpanse.h

    #ifndef SCHIMPANSE_H
    #define SCHIMPANSE_H
    #include "affe.h"
    
    class Schimpanse : public Affe
    {
    public:
        Schimpanse(const string &n, const string &a);
        void hangelt() const;
    };
    
    #endif // SCHIMPANSE_H
    

    schimpanse.cpp

    #include "schimpanse.h"
    #include <string>
    #include <iostream>
    using namespace std;
    
    Schimpanse::Schimpanse(const string &n, const string &a) : Affe(n), Affe(a)
    {
    }
    
    void Schimpanse::hangelt() const{
        cout << name << " hangelt" << endl;
    }
    


  • Schimpanse::Schimpanse(const string &n, const string &a) : Affe(n), Affe(a)
    

    ist kreativ

    Schimpanse::Schimpanse(const string &n, const string &a) : Affe(n, a )
    

    wird der Compiler wohl übersetzen

    Schimpanse::Schimpanse(const string &n) : Affe(n, "Schimpanse")
    

    wäre eine Optimierung.

    Bezüglich der Fehlermeldungen: Copy&Paste!



  • Und in der Fehlermeldung steht nicht einmal der Dateiname drin (und auch keine Zeilennummer), oder hast du das absichtlich weggelassen, damit wir es schwerer haben?

    Dennoch: ich verrate dir, dass der Fehler in gorilla.cpp und schimpanse.cpp, jeweile in Zeile 6, liegt. Die Fehlermeldung nennt doch sogar den Grund!


Anmelden zum Antworten