OOP - Polymorphismus - Fehler im Aufbau/Aufruf meiner Klassen?



  • Nathan schrieb:

    Mein Gott seid ihr kleinlich!
    Der TE will Polymorphie, also muss er virtual verwenden. Punkt.

    Polymorphismus könnte man auch ganz anderes erreichen.

    Nathan schrieb:

    Schon mal etwas von Kontext abhängigen Sätzen gehört?

    Wenn Du aber den Kontext zerkloppst und absolute allgemeingültige Aussagen daras machst, mit "Punkt." muss man einfach widersprechen.

    Doch.
    Wenn Memberfunktionen überschrieben werden sollen, müssen die in der Basisklasse virtual sein.

    Oh. Allgemeingültige Aussage. Kein Bezug zum Medienverleih, sondern man muss immer.



  • #include <iostream>
    
    class Base
    {
    public:
        void print()
        {
            std::cout<<"Base\n";
        }
    };
    
    class Derived : public Base
    {
    public:
        void print()
        {
            std::cout<<"Derived\n";
        }
    };
    
    int main ()
    {
        Base* o = new Derived;
        o->print(); // wird "Base" ausgeben
        delete o;
    }
    

    In diesem Fall wird immer Base::print aufgerufen, weil o ein Zeiger auf ein Objekt des Typs Base zeigt und nicht weiß, dass man die Funktion überschreiben will.
    Das muss man explicit durch virtual kennzeichnen.

    #include <iostream>
    
    class Base
    {
    public:
        virtual void print()
        {
            std::cout<<"Base\n";
        }
    };
    
    class Derived : public Base
    {
    public:
        virtual void print()
        {
            std::cout<<"Derived\n";
        }
    };
    
    int main ()
    {
        Base* o1 = new Derived;
        Base* o2 = new Base;
        o1->print(); // wird "Derived" ausgeben
        o2->print(); // wird "Base" ausgeben
        delete o1;
        delete o2;
    }
    

    Hierbei wird dann immer die Funktion aufgerufen, die zum entsprechenden Typ gehört.

    Die Fehlermeldung besagt aber nur, dass es Medium::ZeigeAusleiheFrist nicht gibt. Bei den abgeleiteten Klassen hast du die Funktion erstellt, aber bei Medium nicht.



  • volkard schrieb:

    Nathan schrieb:

    Schon mal etwas von Kontext abhängigen Sätzen gehört?

    Wenn Du aber den Kontext zerkloppst und absolute allgemeingültige Aussagen daras machst, mit "Punkt." muss man einfach widersprechen.

    Doch.
    Wenn Memberfunktionen überschrieben werden sollen, müssen die in der Basisklasse virtual sein.

    Oh. Allgemeingültige Aussage. Kein Bezug zum Medienverleih, sondern man muss immer.

    Ich zerkloppe den Kontext?
    Meine Aussage mit den Memberfunktionen bezog sich auf die Aussage von zynikus und die wiederrum bezog sich auf meine Aussage, die Kontextabhängig war. Also doch ein indirekter Bezug zum Medienverleih. 😉

    volkard schrieb:

    Nathan schrieb:

    Mein Gott seid ihr kleinlich!
    Der TE will Polymorphie, also muss er virtual verwenden. Punkt.

    Polymorphismus könnte man auch ganz anderes erreichen.

    Js? Wie denn?



  • Nathan schrieb:

    Wie denn?

    Mit switch zum Beispiel.



  • Ich will nun ungern einen neuen Thread aufmachen, aber darf ich hier nochmal bei einer einfachen Sache um Hilfe bitten?

    #include <iostream>
    #include <iomanip>
    #include <cstdio>
    using namespace std;
    
    int main()
    {
        int Hauptmenu_Eingabe;
        int AlleMedienMenu_Eingabe;
    
        while (Hauptmenu_Eingabe != 0){
            cout << "Hauptmenu_Eingabe: ";
            cin >> Hauptmenu_Eingabe;
    
            switch (Hauptmenu_Eingabe) {
                case 1:
                    while (AlleMedienMenu_Eingabe != 0){
                        cout << "AlleMedienMenu_Eingabe: ";
                        cin >> AlleMedienMenu_Eingabe;
    
                        switch (AlleMedienMenu_Eingabe) {
                            case 1:
                                break;
                        }
                    }
                break;
            }
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Ich habe echt keinen blassen schimmer mehr, wieso der wenn ich im Hauptmenü 1 wähle, im Alle Medien Menü dann sage 0 er danach nie wieder in das Alle Medien menü geht.

    Ich drücke Quasi: 1
    0
    1
    (und hier sollte er wieder in das Alle Medien Menü gehen, tut er nur leider nicht :/)



  • AlleMedienMenu_Eingabe ist eben immer noch 0. Du solltest deine Variablen ordentlich initialisieren, bevor du sie für Schleifenbedingungen verwendest.



  • Initialisiere die Variablen mit einem Wert ungleich 0.



  • Auch mit Initialisierung habe ich dieses Problem. Auch Ohne breaks habe ich das Problem ... und ob ich Case 0 weg lasse oder nicht, ändert auch nichts.



  • Yaerox schrieb:

    Auch mit Initialisierung habe ich dieses Problem.

    Dann hast du's falsch gemacht. Zeig den Code.



  • #include <iostream>
    #include <iomanip>
    #include <cstdio>
    using namespace std;
    
    int main()
    {
        int Hauptmenu_Eingabe = 1;
        int AlleMedienMenu_Eingabe = 1;
    
        while (Hauptmenu_Eingabe != 0){
            cout << "Hauptmenu_Eingabe: ";
            cin >> Hauptmenu_Eingabe;
    
            switch (Hauptmenu_Eingabe) {
                case 1:
                    while (AlleMedienMenu_Eingabe != 0){
                        cout << "AlleMedienMenu_Eingabe: ";
                        cin >> AlleMedienMenu_Eingabe;
    
                        switch (AlleMedienMenu_Eingabe) {
                            case 1:
                                break;
                            case 0:
                                break;
                        }
                    }
                    break;
                case 0:
                    break;
            }
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

  • Mod

    Deine while-Abbruchbedingung ist, dass eine deine Variablen einen bestimmten Wert hat. Wenn du nun nach einem Abbruch zu der while-Schleife zurück kehrst, welchen Wert hat diese Variable dann wohl?



  • SeppJ schrieb:

    Deine while-Abbruchbedingung ist, dass eine deine Variablen einen bestimmten Wert hat. Wenn du nun nach einem Abbruch zu der while-Schleife zurück kehrst, welchen Wert hat diese Variable dann wohl?

    Ich verstehe nicht ganz worauf du hinaus möchtest...das Problem ist ja das er das zweite mal nicht in die Switch anweisung geht, obwohl der Wert stimmt.

    int main()
    {
        int Hauptmenu_Eingabe = 1;
        int AlleMedienMenu_Eingabe = 1;
    
        while (Hauptmenu_Eingabe != 0){
            cout << "Hauptmenu_Eingabe: ";
            cin >> Hauptmenu_Eingabe;
    
            cout << Hauptmenu_Eingabe;
    
            switch (Hauptmenu_Eingabe) {
                case 1:
                    while (AlleMedienMenu_Eingabe != 0){
                        cout << "AlleMedienMenu_Eingabe: ";
                        cin >> AlleMedienMenu_Eingabe;
    
                        switch (AlleMedienMenu_Eingabe) {
                            case 1:
                                break;
                            case 0:
                                break;
    
                        }
                    }
                    break;
                case 0:
                    break;
            }
            cout << Hauptmenu_Eingabe;
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Output bei folgender Eingabe: 1
    0
    1
    1
    1
    1
    0

    Hauptmenu_Eingabe: 1
    1AlleMedienMenu_Eingabe: 0
    1Hauptmenu_Eingabe: 1
    11Hauptmenu_Eingabe: 1
    11Hauptmenu_Eingabe: 1
    11Hauptmenu_Eingabe: 1
    11Hauptmenu_Eingabe: 0
    00
    

  • Mod

    Yaerox schrieb:

    SeppJ schrieb:

    Deine while-Abbruchbedingung ist, dass eine deine Variablen einen bestimmten Wert hat. Wenn du nun nach einem Abbruch zu der while-Schleife zurück kehrst, welchen Wert hat diese Variable dann wohl?

    Ich verstehe nicht ganz worauf du hinaus möchtest...das Problem ist ja das er das zweite mal nicht in die innere Switch anweisung geht, obwohl der Wert stimmt.

    Und ich fordere dich auf, mal nachzudenken, welchen Wert deine Abbruchvariable wohl beim zweiten Mal hat. Siehst du jetzt, worauf ich hinaus möchte?

    Diese Probleme kommen daher, das du das Grundproblem "Aufbau eines Menüs" nicht sauber gelöst hast. Das sieht man daran, dass dein Menü und dein Untermenü jeweils anders programmiert sind, obwohl sie funktional gleich sein sollen. Ich sehe ein, dass es für dich wahrscheinlich noch viel zu schwer ist, eine allgemeine Menüklasse zu entwerfen, aber in diesem Notfall können wir ausnahmsweise auch mal zu Copy&Paste Programmierung greifen:
    Wenn du ein funktionierendes, in sich geschlossenes Basismenü hast, zum Beispiel dein Haupmenü, dann kannst du diesen Code wieder benutzen, um deine Untermenüs zu erzeugen. Du brauchst bloß deine Texte und Auswahlpunkte anzupassen. Das ist bei deinem Code derzeit nicht der Fall, denn dein AlleMedienMenu hat vom Aufbau her ein paar entscheidende Unterschiede zu deinem funktionierenden Hauptmenü. Nimm daher mal dein Hauptmenü:

    int Hauptmenu_Eingabe = 1;
    
        while (Hauptmenu_Eingabe != 0){
            cout << "Hauptmenu_Eingabe: ";
            cin >> Hauptmenu_Eingabe;
    
            switch (Hauptmenu_Eingabe) {
                case 1:
                    break;
                case 0:
                    break;
            }
        }
    

    Jetzt fügst du an der Stelle wo das AlleMedienMenu erscheinen soll deinen Hauptmenücode ein. Denk dran, einen eigenen Scope um diesen Code zu setzen (d.h. du sollte geschweifte Klammern drum machen)! Dann änderst du noch alles, was im AlleMedienMenu anders sein soll, lässt die grundlegende Logik aber intakt.

    Dann sollte es funktionieren.



  • Ohh man, ja es war offensichtlich 😕

    Die Variable die ich im zweiten Switch nutze müsste ich einfach auch nur mal wieder auf != 0 setzen 😕

    Nun funktionieren beide...

    Danke


Anmelden zum Antworten