Vererbung, doch ich verstehs nicht..



  • Hallo Leute,

    unser Lehrer hat uns folgende Aufgabe gestellt.
    Wir sollen in Klassen Programmieren, dieses "Projekt" soll mit Visual Studio gemacht werden und am 15. Mai abgabe fertig.

    Die Oberklasse soll Fahrzeug sein und 3 Unterklassen besitzen mit folgenden Funktionen.

    1. Unterklasse: PKW
    Die Unterklasse soll eine Methode haben mit der man den TÜV-STand anzeigen lassen kann, dabei soll das aktuelle Jahr eingegeben werden und in welchem Jahr die letzte TÜV-Püfung war (aktuelles Jahr - TÜV-Prüf-Jahr)
    dann soll ausgegeben werden z.B. letzte TÜV-Prüfung war vor x Jahre
    TÜV-Prüfung 2 jahre oder länger her soll ausgegeben werden das ein neuer Test nötig ist.
    Ansonsten soll alt gesagt werden alles okay oder das in 1 bzw. 2 jahre der nächste TÜV nötig ist.

    2. Unterklasse: LKW
    Die Unterklasse soll eine Methode haben mit der eine Maut abgerufen werden kann. Man gibt ein wieviel man gefahren ist oder wie viele Brücken ect.
    und durch eine festgelegte Maut soll dann der Wert errechnet werden.

    3. Unterklasse: Motorrad
    Die Unterklasse soll die Methode Beschleunigen-Bremsen haben.
    Man gibt eine Max-Geschwindigkeit an und soll bei 0 km/h starten
    Nun beschleunigt man und es soll ausgegeben werden wieviel km/h man fährt
    auch abbremsen soll möglich sein.
    Das Programm soll erst auf befehl beenden.
    WICHTIG!
    Die Geschwindigkeit darf niemals über Max-Geschwindigkeit oder unter 0 liegen.

    Als ich diese Aufgabe Anfang der Woche erhielt...
    Dachte ich mir nur... WAS?!?!?!
    Ich verstehe nichts von C++ wir fangen mit Vererbung erst an und er verlangt solch eine komplexe Aufgabe (jedenfalls aus meiner Sicht)

    Könnt ihr mir bitte helfen?

    LG Paranoid



  • Hi, willkommen im Forum. Lies dir bitte den Link in meiner Signatur aufmerksam durch und nimm dir zu Herzen was drin steht - und stell deine Frage dann nochmal. Wenn du uns nicht sagst was du schon gemacht hast, und was genau du nicht verstanden hast, kann dir auch nicht geholfen werden. Eine komplettlösung wirst du hier nicht bekommen, schon garnicht für deine Hausaufgaben.



  • Also ich habe bisher folgendes fertig:

    beschleunigung des Motorrads, das bremsen sollte ich ebenfalls noch schaffen.
    und mit if-else schleifen sollte ich ja immer wählen können zwischen beschleunigen und bremsen

    das mit dem LKW ist ja auch nicht soo schwer...
    dort einen Mautwert festlegen z.B. 3€/Brücke
    und dann halt nur cin 5 brücken (brücken * Mautwert = x)

    Was ich ganz speziell nicht verstehe ist diese Erstellung damit Sachen vererbt werden können...
    Wie gesagt es ist die 1. Stunde in der wir uns mit Vererbung beschäftigt haben und sollen uns das alles aneignen...
    Ich weiß nicht einmal wie ich irgendwie diese Header-Dateien machen soll und was da rein kommt und so...

    Das möchte ich gern Erklärt haben, woran man erkennen kann, das befehl xyz in eine Headerdatei gehört oder woanders rein...

    Gruß Paranoid



  • Ich verstehe nichts von C++

    Dein Lehrer aber anscheinend auch nicht, zumindest nicht, wenn das die komplette Aufgabenstellung ist.

    Die einzelnen Klassen (Fahrzeug, PKW, LKW, Motorrad) haben rein gar nichts miteinander zu tun. Öffentliche (public) Vererbung sollte nur genutzt werden, wenn es sich um eine IST-EIN Beziehung handelt - in der Realität IST-EIN PKW zwar ein Fahrzeug, das spiegelt sich allerdings nicht in der Aufgabenstellung wieder, da das Fahrzeug gar keine eigenen Methoden definiert.
    Statt Vererbung zu verwenden, wären hier drei einzelene Klassen PKW, LKW und Motorrad viel angebrachter.

    Jetzt mal als anfang ein bisschen Code:

    class Fahrzeug 
    {
      /* Leere Klasse, da ja laut Aufgabenstellung nichts in diese Klasse hineingehört */
    };
    
    class PKW: public Fahrzeug // Vererbung - Macht eigentlich keinen Sinn, aber wenn es der Lehrer so möchte
    {
    public:
      PKW(int pruefJahr_); // Konstruktor, dem das aktuelle Prüfjahr übergeben wird 
      void pruefe(); // Methode zum Prüfen des TÜV-Stands
    private:
      int pruefJahr; // Das aktuelle Prüfjahr
    };
    

    So ungefähr könnten deine Klassen aussehen. Zur Implementierung habe ich jetzt mal nichts geschrieben, da die eigentlich schon vollkommen in Textform in der Aufgabenstellung steht.

    Also nicht davon Abschrecken lassen, dass "Vererbung" genutzt werden soll, sondern einfach mal probieren die einzelnen Funktionen zu schreiben.

    Das möchte ich gern Erklärt haben, woran man erkennen kann, das befehl xyz in eine Headerdatei gehört oder woanders rein...

    Die Definition der Klasse und die Deklaration ihrer Methoden (Funktionen) schreibst du in die Header-Datei, also eine Datei mit der Endung .h .
    In einer gleichnamigen Datei, mit der Endung .cpp, schreist du dann die Defintionen der Klassenmethoden. Der Aufbau ist normalerweise folgendermaßen:

    // PKW.h
    
    #ifndef PKW_H // Include guard, kannst du wahrscheinlich auch weglassen, wenn 
    #define PKW_H // ihr das noch nicht hattet
    
    #include "Fahrzeug.h"
    
    class PKW: public Fahrzeug
    {
    public:
      PKW(int pruefJahr_); 
      void pruefe(); 
    private:
      int pruefJahr;
    };
    
    #endif
    
    --------------------------------------
    // PKW.cpp
    
    #include "PKW.h"
    
    PKW::PKW(int pruefJahr_)
    {
      pruefJahr = pruefJahr_;
    }
    
    void PKW::pruefe()
    {
      /* Hier bist du gefragt */
    }
    

    ...



  • ja okay ich habe ihn gerade gefragt das hat er vergessen zu erwähnen (sowas gehört meiner meinung nach auf das Arbeitsblatt -.-)

    er meinte irgendwie folgendes:

    class Fahrzeug
    {
        private:
                string marke;
                string fahrzeugtyp;
        protected:
                string nummernschild;
                string fahrzeugfarbe;
    }
    

    Ich werde da aber nicht so ganz schlau draus...
    das sind jetzt vererbungsattribute, die dann in den einzelnen Klassen eingebunden werden können oder?
    Sodass gesagt wird: pkw.marke = mercedes

    richtig??



  • Sodass gesagt wird: pkw.marke = mercedes

    Nicht ganz. Hier mal eine Tabelle (von asc), die die verschiedenen Zugriffsmöglichkeiten zeigt:

    Zugriff möglich?
               In Klasse   In abgeleiteter Klasse   Von außen
    public        ja                 ja                ja
    protected     ja                 ja               nein
    privat        ja                nein              nein
    

    D.h. auf Variablen oder Methoden, die in deiner Klasse als public definiert sind, kannst du von überall zugreifen. Bei der Klasse Fahrzeug gibt es solche Methoden/Variablen nicht.
    Auf Variablen oder Methoden die protected sind, kannst du auch in abgeleiteten Klassen zugreifen, allerdings nicht von außen.
    Und auf Variablen oder Methoden die private sind, kannst du nur in der Klasse selbst zugreifen.

    Folgendes ist also nicht möglich:

    PKW einpkw;
    einpkw.marke = "mercedes" // Fehler: Die Variable marke ist private und kann nicht von außen geändert werden
    

    Ich werde jetzt nicht die verschiedenen Vererbungsmechanismen beschreiben, dazu gibt's genug Material im Internet.
    Am besten liest du dich erstmal etwas ein und fragst nochmal, wenn du konkrete Probleme hast.

    ...


Anmelden zum Antworten