Virtuelle Funktionen und STL



  • Ich brauche dringend Hilfe. Kann mir jemand helfen ­čÖé

    In der Datei fahrzeug.h seien die folgenden Klassen definiert:

    class Rennwagen : public Fahrzeug {
    public:
    void fahren() {
    cout << "Vroooooom.\n";
    }
    };
    class Traktor : public Fahrzeug {
    public:
    void fahren() {
    cout << "tuktuktuktuktuk.\n";
    }
    };

    In einem C++- Programm sollen Objekte vom Typ Rennwagen und Traktor gemeinsam in
    einem STL-Container vom Typ list verwaltet werden.
    a) Erg├Ąnzen Sie die fehlende Basisklasse Fahrzeug.
    b) Schreiben Sie eine main()-Funktion, die jeweils zwei Objekte vom Typ
    Rennwagen und Traktor einem geeigneten STL-Container vom Typ list
    hinzuf├╝gt. Iterieren Sie ├╝ber den list-Container und lassen Sie alle Fahrzeuge
    fahren.



  • @tariker
    Ja, ich k├Ânnte helfen. Aber du zeigst so wenig Initiative, dass das Posting eigentlich sagt: "Kann das bitte jemand f├╝r dich machen?". Ja, ich ich k├Ânnte, aber ich unterst├╝tze derart freche Postings nicht. Du hast dir nicht ein Mal die M├╝he gemacht eine fachliche Frage zu stellen.
    Entweder du bezahlst jemanden daf├╝r (Unterforum Projekte) oder du gibst dir M├╝he und zeigst wenigstens einen Ansatz, bei dem man dir helfen k├Ânnte.
    Viel Erfolg!



  • Das ist eine sehr einfache Aufgabe, die aber Grundkenntnisse im Bereich Vererbung erfordert.
    Mit dem Entwurf einer Basisklasse solltest du am besten anfangen.

    Wenn du daf├╝r schon mal einen Ansatz hier posten w├╝rdest, k├Ânnten wir dir einen Schubs in die richtige Richtung geben.



  • @tariker sagte in Virtuelle Funktionen und STL:

    In einem C++- Programm sollen Objekte vom Typ Rennwagen und Traktor gemeinsam in
    einem STL-Container vom Typ list verwaltet werden.

    Das geht nicht.

    Ein STL-Container kann nur einen Typ verwalten, nicht mehrere. Hier w├Ąre es z.B. m├Âglich, eine std::list<std::unique_ptr<Fahrzeug>> zu nutzen. Dann verwaltet der Container aber nicht Objekte vom Typ Rennwagen und Traktor, sondern vom Typ (Smart-)Pointer auf Fahrzeug. Das ist vermutlich gefordert.

    Alternativ kannst du nat├╝rlich auch eine std::list<std::variant<Rennwagen, Trecker>> oder ├Ąhnliches nehmen und mit std::visit spielen ­čÖé



  • @wob
    Technisch richtig, aber ich glaube, du interpretierst zu viel in die Aufgabe.



  • @wob sagte in Virtuelle Funktionen und STL:

    @tariker sagte in Virtuelle Funktionen und STL:

    In einem C++- Programm sollen Objekte vom Typ Rennwagen und Traktor gemeinsam in
    einem STL-Container vom Typ list verwaltet werden.

    Das geht nicht.

    Ein STL-Container kann nur einen Typ verwalten, nicht mehrere. Hier w├Ąre es z.B. m├Âglich, eine std::list<std::unique_ptr<Fahrzeug>> zu nutzen. Dann verwaltet der Container aber nicht Objekte vom Typ Rennwagen und Traktor, sondern vom Typ (Smart-)Pointer auf Fahrzeug. Das ist vermutlich gefordert.

    Alternativ kannst du nat├╝rlich auch eine std::list<std::variant<Rennwagen, Trecker>> oder ├Ąhnliches nehmen und mit std::visit spielen ­čÖé

    Wenn du den armen Frischling verwirren wolltest, hast du das sicher erreicht. ­čśÄ



  • @DocShoe sagte in Virtuelle Funktionen und STL:

    @wob
    Technisch richtig, aber ich glaube, du interpretierst zu viel in die Aufgabe.

    N├Â, ich habe nur absichtlich die Aufgabenstellung w├Ârtlich interpretiert. Und da die Frage einfach copy-paste einer ├ťbungsaufgabe war, habe ich noch einen ganz anderen Vorschlag zur L├Âsung dazugepackt.

    Die Bezeichnung "armer Frischling" von @It0101 finde ich irref├╝hrend, denn es wurden bislang ja keine eigenen Anstrengungen zur L├Âsung unternommen. Also eher "fauler Frischling". Nicht einmal der Quellcode ist ordentlich formatiert.



  • @DocShoe dann tut es mir leid, dass du mich falsch verstanden hast. Ich hab die Aufgaben schon gemacht. Wei├č aber nicht ob diese richtig sind. ich schreibe sie mal hier rein:

    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    list <Fahrzeug*> vec;
    class Fahrzeug{
       public: virtual void fahren()=0;
    }
    class Rennwagen : public Fahrzeug{
    void fahren() const {
    cout <<"Vroomm .\n";
    };
    class Traktor: public Fahrzeug{
    void fahren() const {
    cout <<"tuktuktuk.\n";
    };```
    
    ```//Aufgabe b
    int main(){
    Rennwagen rennwagen;
    Traktor traktor;
    for(Fahrzeug *f=vec) f->fahren();
    
    auto it = vec.begin();
    while (it != vec.end()){
    (*it)->fahren();
    it++;
    }```


  • @tariker Und das ├╝bersetzt? Ehrliche Frage. Hab's nicht ausprobiert.

    Zumindest Aufgabe 1 sieht mir beim dr├╝ber gucken eher nicht so aus.



  • @tariker sagte in Virtuelle Funktionen und STL:

    Ich hab die Aufgaben schon gemacht.

    Sehr gut. Dann musst du nun bitte den Quelltext richtig formatieren mit drei `-Zeichen hintereinander (vor und hinter dem Quellcode). Ansonsten werden wichtige Zeichen wie z.B. der * nicht korrekt dargestellt.

    Aber generell war in der Aufgabe von je 2 Treckern und 2 Rennwagen die Rede. Wo sind die bei dir?



  • Ne, das kann so nicht funktionieren.

    • list<Fahrzeug> kennt auf keinen Fall Fahrzeug.
    • Fahrzeug braucht einen virtuellen Destruktor
    • polymorphe Objekte direkt in einen Container zu stecken ist selten eine gute Idee, es sei denn, object slicing ist beabsichtigt.
    • in main wird die Liste nie bef├╝llt.
    • ein std::list vec zu nennen ist bestenfalls ungl├╝cklich.

    Lass das mal durch einen Compiler laufen... wenn du keinen hast gibt┬┤s auch online welche (Ideone, C++ shell)



  • @DocShoe einen Compiler habe ich auch. da benutze ich eclipse. Das problem ist, dass ich nicht weiter komme. Kann mir hier keiner behilflich sein



  • @tariker
    Und, ├╝bersetzt das bei dir? Nein? Welche Fehlermeldung spuckt der Compiler denn aus?
    Versetz dich doch mal in die Situation der anderen Forenteilnehmer. Du lieferst kaum Informationen und erwartest, dass sie dir bei Problemen helfen, die nur du kennst.

    • Stell konkrete Fragen und poste soviel Information wie m├Âglich und gleichzeitig so wenig wie n├Âtig.
    • Erwarte nicht, dass die hier die L├Âsung aufm Silbertablett pr├Ąsentiert wird. Das Motto ist hier Hilfe zur Selbsthilfe


  • @tariker und bitte formatiere deinen Quellcode! Ansonsten ist es hier nicht m├Âglich zu sehen, was du wirklich geschrieben hast. Siehe mein vorheriges Posting. Du klickst bitte bei deinem vorherigen Beitrag, wo der Quellcode drin ist, auf die 3 Punkte rechts und dann auf "Bearbeiten" und dann machst du die drei `-Zeichen vor und hinter deinen Code. Dann ist der Code auch nicht mehr komisch kursiv, sondern lesbar. Dann k├Ânnen wir weiterschauen. Am besten sagst du dann noch, was genau das Problem ist.



  • @wob tut mir leid. hab es gemacht;)



  • Gut, jetzt kann man das wenigstens lesen.

    Bitte kompiliere und stelle sicher, dass keine Warnungen und Kompilierfehler auftreten. Ein paar Dinge:

    • Klassendefinitionen wie class X { ... }; haben ein Semikolon am Ende (fehlt bei deinem Fahrzeug) - auch geh├Ârt zu jeder ├Âffnenden Klammer eine schlie├čende. Bei dir scheinen einige } zu fehlen.
    • void fahren() und void fahren() const sind unterschiedliche Funktionen. Nutze das Schl├╝sselwort override, um sicherzustellen, dass das "fahren" aus Rennwagen und Traktor das "fahren" aus Fahrzeug ├╝berschreibt.
    • class ist by default private. Soll das "fahren" nicht public sein?
    • Der Punkt von @DocShoe mit "polymorphe Objekte..." ist nicht mehr relevant, da dieser durch die fehlende Formatierung und somit einen nicht sichtbaren Stern entstanden war
    • (schrieb schon @DocShoe) Fahrzeug braucht einen virtuellen Destruktor. Die anderen Punkte von DocShoe sind ebenfalls noch zu beachten

    Deine Liste "vec" solltest du innerhalb von "main" deklarieren, wo das Fahrzeug schon bekannt ist. Es ist immer hilfreich, globale Variablen zu vermeiden.

    In deinem "main" solltest du noch einmal genauer nachschauen / genau ├╝berlegen, was du eigentlich machen willst.


Log in to reply