Klassen/Member Funktion



  • Moin, ich bin nicht so der Beste in Coden deswegen probiere ich es mal. Ich bekomme eine Fehlermeldung in Zeile 59 mit '' no match for 'operartor<< '. Meine Idee hinter dieser Zeile ist es, dass wenn Zeile 59 gelesen wird, er in Zeile 39 springt und dann wiederum in Zeile 14, um die velocity zu geben. Im Prinzip soll es wie die Zeile 58 sein, aber ich dachte man es auch anders schreiben. Kann da jemand helfen?

    #include <iostream>
    
    using namespace std;
    
    class vehicle{
    private:
        int velocity;
        int wheels;
    public:
        void set(int velocity_, int wheels_){
        velocity = velocity_;
        wheels = wheels_;}
    
        int get_velocity(int a){
        return a;}
    
        int get_wheels(){
        return wheels;}
    
        bool is_moving(){
        if(velocity != 0)
            return true;
        else
            return false;}
    };
    
    class car : public vehicle{     // inheritance from vehicle (: public)
    public:
        int velocity;
        int wheels = 4;
    };
    
    class small_car : public car{
        int a;
    public:
        void set(int a_){
        a = a_;
        a = rand () % 130;}
       void get_velocity(){
      vehicle().get_velocity(a);}
    };
    
    class sport_car : public car{
    public:
        int get_velocity(){
        velocity = rand () % 250;
            return velocity;}
    };
    
    
    int main()
    {
    
    int a=10, b=10, size=10;
    
    vehicle fahrzeug;
        fahrzeug.set(a, b);
        cout << "Sport car drives " << sport_car().get_velocity() << " km/h" << endl;
        cout << "Small car drives " << small_car().get_velocity()  << " km/h" << endl;
    
        return 0;
    }
    


  • Kannst Du mir bitte erklären was void bedeutet?



  • #include <iostream>
    
    class vehicle {
        int velocity;
        int wheels;
    
    public:
        vehicle(int velocity, int wheels) : velocity{ velocity }, wheels{ wheels } {}
    
        int get_velocity() const { return velocity; }
        int get_wheels() const { return wheels; }
        bool is_moving() const { return velocity != 0; }
    };
    
    class car : public vehicle
    {
    public:
        car(int velocity, int wheels = 4) : vehicle{ velocity, wheels } {};
    };
    
    int main()
    {
        vehicle foo{ 100, 4 };
        std::cout << foo.get_velocity();
    }
    

    Was small_car und sport_car soll habe ich leider nicht verstanden.



  • @Florian200 sagte in Klassen/Member Funktion:

    Moin, ich bin nicht so der Beste in Coden deswegen probiere ich es mal.

    Ich verstehe schon diese Schlussfolgerung nicht 🤔



  • @Belli sagte in Klassen/Member Funktion:

    @Florian200 sagte in Klassen/Member Funktion:

    Moin, ich bin nicht so der Beste in Coden deswegen probiere ich es mal.

    Ich verstehe schon diese Schlussfolgerung nicht 🤔

    Ja, ist komisch formuliert und ich weiss auch nicht was er uns damit sagen will. Aber grundsätzlich ist IMO die einzige Möglichkeit irgendwas wirklich zu lernen es zu versuchen. Ist also nix dagegen einzuwenden. Aber vielleicht meint er auch daher versucht er mal hier zu fragen? Keine Ahnung.



  • @Florian200 sagte in Klassen/Member Funktion:

    Meine Idee hinter dieser Zeile ist es, dass wenn Zeile 59 gelesen wird, er in Zeile 39 springt und dann wiederum in Zeile 14, um die velocity zu geben. Im Prinzip soll es wie die Zeile 58 sein, aber ich dachte man es auch anders schreiben. Kann da jemand helfen?

    In Zeile 58 wird die Funktion sport_car::get_velocity aufgerufen. Diese hat den Return-Typ int, d.h. der Aufruf der Funktion hat ein Ergebnis (vom Typ int). Dieses Ergebnis wird dann als Argument für den << Operator verwenden.

    In Zeile 59 wird die Funktion small_car::get_velocity aufgerufen. Diese hat den Return-Typ void, d.h. der Aufruf der Funktion hat kein Ergebnis. D.h. es gibt auch kein Ergebnis das als Argument für den << Operator verwendet werden könnte. Ist im Prinzip ähnlich wie wenn du schreiben würdest

    std::cout << "test234" << ;
    

    Also langer Rede kurzer Sinn: nein, man kann das nicht so schreiben.



  • @Swordfish
    Es ging um eine Aufgabe, dass man eine Klasse Vehicle erstellt und Auto, die von Vehicle erbt und halt small und sport car die von der Klasse Auto erbt. Danke, für den Code könntest du Zeile 18 vielleicht mal erklären?



  • @Florian200 small und sport car haben denn eine Geschwindigkeit, die man ausgeben soll.



  • @Florian200 sagte in Klassen/Member Funktion:

    @Swordfish
    Es ging um eine Aufgabe, dass man eine Klasse Vehicle erstellt und Auto, die von Vehicle erbt und halt small und sport car die von der Klasse Auto erbt. Danke, für den Code könntest du Zeile 18 vielleicht mal erklären?

    Bei dir hat die Klasse vehicle Räder und die Klasse car, die bereits die Räder von vehicle erbt, hat nochmal neue Räder. Du hast also die Räder-Variable doppelt (die aus vehicle sind zwar private, aber sie sind trotzdem vorhanden).
    (analoges gilt für die Geschwindigkeit)

    @Swordfish ruft einfach im Konstruktor von car den Konstruktor von vehicle auf und setzt dort die Geschwindigkeit und die Räder.

    car(int velocity, int wheels = 4)  // das hier ist der car-Konstruktor
     :  // Initialisieren von Basisklassen & Variablen nach dem : 
      vehicle{ velocity, wheels } // zum Initialisieren den vehicle-Konstruktor mit velocity und wheels aufrufen
     {
       // kein Code nötig (alles wichtige wurde bereits im Initialisierungsabschnitt erledigt)
     }; 
    


  • @wob ah super danke. Im diesen Code würde die Geschwindigkeit = 100 sein für jedes Auto oder hab ich was falsch gemacht oder wie kann ich die Zeile 18 aufrufen?



  • @Florian200 ah hab schon 🙂


Log in to reply