Vektor-Funktion bricht nach einer Eingabe ab



  • Hallo allesamt 🙂

    Ich bin wiedermal am üben und habe soweit einen Programmcode geschrieben, der fast alles macht, was ich bis jetzt möchte. Bis auf meine Vektor-Funktion, die zwar fehlerfrei kompiliert, allerdings nicht das tut was sie soll 😃
    Der Benutzer soll in der Lage sein zu bestimmen wie viele "IDs", sprich Zahlen er eingeben soll und dementsprechend viele Zahlen auch eingeben.

    Benutzer .CPP

    Benutzer::Benutzer() { }
    
    Benutzer::Benutzer(vector<Video>* list) {
        
        myFavourite = list;
    }
    
    Benutzer::Benutzer(string u, string pw) : user(u), password(pw) {}
    
    void Benutzer::set_Benutzer(string u, string pw) {
    
    	user = u; 
    	password = pw;
    
    }
    
    
    string Benutzer::get_Benutzer() {
    
    	return user + " " + password; 
    
    }
    
    void Benutzer::print() {
    
        
            cout << "Benutzer-ID: " << user << endl << "Passwort: " << password << endl;
    }
    
    void Benutzer::fillFavourite(std::vector<Video>* list) {
        
        int id;
        
        cout << "Wie viele Filme moechtest du deiner Liste hinzufuegen?";
        int favouriteSize;
        cin >> favouriteSize;
        
        for (int i = 0; i < favouriteSize; i++) {
            
            cout << "Bitte die ID des Films eingeben: ";
            cin >> id; 
            
            Video newBenutzer(id);
            list->push_back(newBenutzer);
            cout << endl;
        }
     
        cout << endl;
    }
    
    void Benutzer::printFavourite( vector<Video>* list) {
        
        for (unsigned int i = 0; i < list->size(); i++) {
            
            cout << "Film-ID: " << (*list)[i].getID() << endl;
        }
    }
    
    

    Video .CPP

    Video::Video(int id) {
        
        id = 0; 
    }
    
    Video::Video(int i, string t, int v, int l) : id(i), titel(t), views(v), limit(l) {
    }
    
    
    int Video::getID() {
    
        return id;
    }
    
    string Video::getTitel() {
    
        return titel;
    }
    
    int Video::getViews() {
    
        return views;
    }
    
    int Video::getLimit() {
    
            return limit;
    }
    
    void Video::print() const {
        
        if (limit > 8 || limit < 0) {
    
            throw runtime_error("Ungueltiger Zahlenbereich!");
        } else {
    
        cout << "ID:" << id << " Titel:" << titel << " Views:" << views << " Limit:" << limit << endl;
    
        }
        
    }
    

    Main

    int main()
    {
    
    	Video video1(3, "Der Pate" , 2, 8); 
    	Video video2(2, "Peter Pan", 5, 7);
    	video1.print();
    	video2.print();
    
    
    	/*Benutzer user1;	
            user1.print();*/
            
            Benutzer user; 
            
            vector<Video>* myFavourite; 
           
            user.fillFavourite(myFavourite);
            user.printFavourite(myFavourite);
            
            return 0; 
            
    }
    

    Ich bin mir ziemlich sicher, dass der Fehler der "fillFavourite"-Funktion zugrunde liegt, aber ich grübel schon die ganze Zeit vor mich hin und komme nicht drauf, was ich falsch umgesetzt habe.



  • @Suprax sagte in Vektor-Funktion bricht nach einer Eingabe ab:

    Ich bin mir ziemlich sicher, dass der Fehler der "fillFavourite"-Funktion zugrunde liegt,

    Woran merkst du, dass sie "nicht das tut was sie soll"?
    Was passiert stattdessen?


  • Mod

    Zu viele Pointer im Programm. Null wäre hier die korrekte Anzahl. Du hast nicht einen einzigen echten Vector im Programm, bloß lauter Zeiger ins Nichts.

    Vergiss an dieser Stelle am besten ganz, was du über Zeigen zu wissen glaubst, und programmier' ohne ein einziges * im Programm (Multiplikation ausgenommen).

    Ich finde dein Datenmodell auch etwas komisch. Wem gehört deiner Meinung nach die Favoritenliste? Die ist derzeit völlig unabhängig vom Nutzer. Wahrscheinlich erübrigt sich dein Problem von ganz alleine, wenn du deine Daten besser modellierst. Derzeit hat nämlich niemand Verantwortung für die Favoritenliste, entsprechend kümmert sich auch niemand drum, und wenn sie dann benutzt wird, explodiert es.

    Ähnliches wird sich abspielen, wenn du deine Videoklasse benutzen willst. Die scheint die Funktionalität eines Video (im Sinne einer Videodatei) und eines Videoindexes zu vermischen und macht beides nicht richtig.



  • @DirkB per Debugger. Ich sehe, dass das Programm zwar in die Funktion reinspringt, die ersten 3 Schritte ausführt, aber dann bricht es ab. Es springt erst gar nicht in die For-Schleife.

    @SeppJ danke für das Feedback. Ich bin noch relativ am Anfang und habe vor allem bei Zeigern meine Probleme.
    Zu deiner Frage: die Aufgabe bestehen aus drei Klassen. Die erste Klasse ist "Video", die zweite "Benutzer" und die dritte "OnlineVideothek" ist die eigentliche Klasse, die beide Klassen, sprich Video und Benutzer aufruft und dann erst wirklich was passiert.

    Die Aufgaben der ersten beiden Klassen sind lediglich das "Gerüst", dass später durch die dritte Klasse eine Funktion ausüben, oder irre ich mich da?
    Also sollte ich erstmal alle Zeiger aus meinem Programm entfernen?



  • @Suprax sagte in Vektor-Funktion bricht nach einer Eingabe ab:

    Benutzer::Benutzer() { } 
    Benutzer::Benutzer(vector<Video>* list) {
    Benutzer::Benutzer(string u, string pw) : user(u), password(pw) {}
    

    Man kann einen Benutzer ohne alles anlegen, einen mit einer Videoliste oder einen mit Namen und Passwort - das scheint irgendwie nicht so ganz durchdacht zu sein.



  • @manni66

    Danke! Auch wenn es jetzt sich dumm anhört, aber genau solche deutlichen Aussagen lassen mich das ganze noch besser verstehen. Ich habs geändert.

    Benutzer::Benutzer(string u, string pw, vector<Video> list) : user(u), password(pw), myFavourite(list) {}
    

    So kann man jetzt zumindest einen Benutzer anlegen, der ein Benutzernamen, Passwort enthält und zudem noch eine Favoritenliste anlegen kann


  • Mod

    @Suprax sagte in Vektor-Funktion bricht nach einer Eingabe ab:

    Die Aufgaben der ersten beiden Klassen sind lediglich das "Gerüst", dass später durch die dritte Klasse eine Funktion ausüben, oder irre ich mich da?
    Also sollte ich erstmal alle Zeiger aus meinem Programm entfernen?

    Du musst schon selber wissen, wie dein Datenmodell aussehen soll. Was ist ein Nutzer und welche Eigenschaften hat er? Was ist ein Video und welche Eigenschaften hat es? Was ist eine Onlinevideothek und was tut sie? Sind diese drei Klassen von Objekten überhaupt ausreichend (und notwendig) für die Funktionalität deines Gesamtprogramms?

    Entsprechend musst du auch verstehen was ein Zeiger ist, wozu man sie benutzt, und ob dies für die notwendig ist. Zeiger sind indirekte Verweise. Das kommt schon vor, dass man so etwas braucht, beispielsweise könnte eine Favoritenliste eine Liste von Verweisen auf Videos sein. Als Faustregel kannst du aber annehmen, dass man in C++ ziemlich selten auf explizite Zeiger trifft, da die meisten Indirektionen versteckt gekapselt sind (ein Vektor besteht z.B. aus mehreren Zeigern, aber man sieht sie nicht). So eine Favoritenliste mag einer der ganz wenigen Fälle sein, wo man als Anfänger mal einem expliziten * im Programm begegnet.

    Derzeit hast du aber einen Verweis auf eine Liste aus Videos, nicht eine Liste aus Verweisen auf Videos. Ein gewaltiger Unterschied und mit eine der Ursachen für dein Problem.



  • @SeppJ das heißt ich habe lediglich eine Liste, auf die ich verweise, aber ich verweise nicht auf die Videos der Liste?

    Grundsätzlich verstehe ich, was die Aufgaben der einzelnen Klassen sein sollen. Aber dann frage ich mich, z.b. wenn ich als aller erstes die Klasse "Video" schreibe, ob ich da schon ein Container mit einer gewissen Anzahl an Videos erstellen soll oder lediglich das Gerüst zu Erstellung von Objekten der Klasse Videos ohne solche Objekte zu erzeugen?


  • Mod

    @Suprax sagte in Vektor-Funktion bricht nach einer Eingabe ab:

    @SeppJ das heißt ich habe lediglich eine Liste, auf die ich verweise, aber ich verweise nicht auf die Videos der Liste?

    Ein vector<Video> * ist ein Verweis auf eine Liste aus Videos. Eine vector<Video*> ist eine Liste aus Verweise auf Videos.

    Grundsätzlich verstehe ich, was die Aufgaben der einzelnen Klassen sein sollen. Aber dann frage ich mich, z.b. wenn ich als aller erstes die Klasse "Video" schreibe, ob ich da schon ein Container mit einer gewissen Anzahl an Videos erstellen soll oder lediglich das Gerüst zu Erstellung von Objekten der Klasse Videos ohne solche Objekte zu erzeugen?

    Argh. Da hast du noch nicht verstanden, was Klassen, Objekte, etc. sind. Eine Klasse ist eine Idee von etwas. Die Lexikondefinition, die Blaupause, der Bauplan, die Patentvorschrift. Ein Objekt ist eine konkrete Umsetzung dieser Idee. Ein Container von Objekten ist eine ganze Menge solcher Umsetzungen.

    Wenn jemand einen Bauplan für Videos schreibt, entstehen dadurch von alleine Videos? Eher hat doch eine Videothek eine ganze Menge von Videos in ihrem Besitz.



  • @SeppJ
    Du bist echt ein Segen gerade für mich! 😁

    Nehmen wir mein Beispiel: Ich muss drei Klassen konzepieren. Die erste ist die Klasse Video.
    Die zweite ist die Klasse Benutzer und die dritte Klasse ist die "OnlineVideothek".
    Die dritte Klasse wird als "Herzstück" der Klassen beschrieben und ruft beide Klassen auf.
    Das heißt ich entwickle lediglich den Bauplan für die ersten zwei Klasse.

    Setze ich aber in beiden Klasse noch keine Objekte rum?
    In der zweiten Klasse verlangt man, dass ich eine Datenstruktur für eine Favoritenliste anlege -> in dem Fall bieten sich Vektoren sehr gut an.
    Ich soll mehrere Favoriten speichern können, diese kann ich entweder per

    • ID eines Videos speichern
    • oder per Referenz auf ein Video speichern
    • oder einen Zeiger auf ein Video speichern

    Das ist der Punkt der mich verwirrt. Lege ich denn bereits ein Objekt der Klasse Video an oder lediglich eine Vektoren-Funktion, die eine Liste aus Verweise auf Videos ist?

    #edit: Also sozusagen lege ich für Klasse Video und Benutzer lediglich Baupläne an, die aber noch nichts in dem Sinne umsetzen.
    Die dritte Klasse ist allerdings dafür zuständig die Baupläne der beiden Klassen umzusetzen, richtig?

    #edit2: Im Bezug auf mein Problem hier:

    
    void Benutzer::fillFavourite(std::vector<Video*> list) {
        
        int id;
        
        cout << "Wie viele Filme moechtest du deiner Liste hinzufuegen?";
        int favouriteSize;
        cin >> favouriteSize;
        
        for (int i = 0; i < favouriteSize; i++) {
            
            cout << "Bitte die ID des Films eingeben: ";
            cin >> id; 
            
            Benutzer newBenutzer(id);
            list.push_back(newBenutzer);
            cout << endl;
        }
    

    Wenn ich richtig es verstehe, dann versuche ich gerade dem Objekt der Klasse Benutzer "newBenutzer" einen Parameter "id" zu übergeben, den die Klasse Benutzer gar nicht besitzt, richtig?


  • Mod

    @Suprax sagte in Vektor-Funktion bricht nach einer Eingabe ab:

    #edit2: Im Bezug auf mein Problem hier:

    
    void Benutzer::fillFavourite(std::vector<Video*> list) {
        
        int id;
        
        cout << "Wie viele Filme moechtest du deiner Liste hinzufuegen?";
        int favouriteSize;
        cin >> favouriteSize;
        
        for (int i = 0; i < favouriteSize; i++) {
            
            cout << "Bitte die ID des Films eingeben: ";
            cin >> id; 
            
            Benutzer newBenutzer(id);
            list.push_back(newBenutzer);
            cout << endl;
        }
    

    Wenn ich richtig es verstehe, dann versuche ich gerade dem Objekt der Klasse Benutzer "newBenutzer" einen Parameter "id" zu übergeben, den die Klasse Benutzer gar nicht besitzt, richtig?

    Dieser Code ist völlig wirr, wie du so langsam selber verstehst. Du erzeugst einen Benutzer aus einer Id (die wohl die Katalognummer eines Videos sein soll). Aber was soll das bedeuten? Das ist nicht, wie das im wirklichen Leben läuft. Nutzer einer Videothek entstehen nicht aus Katalognummern von Videos. Dann möchtest du diesen neuen Benutzer in eine Liste von Videos schreiben. Auch völlig wirr. Und diese Liste von Videos hat auch überhaupt nichts mit dem Nutzer zu tun, für den du diese Funktion aufrufst (denn diese Funktion ist eine Funktion eines konkreten Benutzers). Was wahrscheinlich auch nicht so sein soll, denn es soll sich ja wohl um eine Liste von Favoriten eben dieses Nutzers handeln. Aber Nutzer haben bei dir gar keine Favoritenliste, daher geht das auch gar nicht.

    Die Lösung kommt aus dem, was du im ersten Absatz beschreibst (hier nicht zitiert): Es gibt die Klasse Video. Es gibt die Klasse OnlineVideothek. Jede OnlineVideothek hat eine Menge von konkreten Videos in ihrem Besitz, aber jede Videothek kann andere Videos haben. In Code grob so:

    class Video {...};
    
    class Videothek 
    {
        vector<Video> videos;
       
        ...videos werden befüllt...
    };
    

    Die Videothek hat auch Benutzer. Ein Benutzer der Videothek hat Favoriten aus dieser Videothek. Er besitzt aber nicht die konkreten Videos, sondern hat nur einen Verweis auf seine Favoriten. Er könnte sie anhand ihres Namens kennen, oder anhand der Katalognummer. Sagen wir mal Katalognummer (Und setzen voraus, dass diese sich nicht ändert). Dann hat ein Nutzer also eine Liste von Nummern, die sich auf die videos seiner Videothek beziehen, und die Videothek hat konkrete Nutzer:

    class User
    {
       vector<int> favorite_video_catalog_numbers;
      ...irgendwie die Favoritenliste füllen...
    };
    
    class Videothek
    {
       ... siehe oben...
      vector<User> users;
    };
    

    Dann besitzt jede Videothek eine eigene Menge von Benutzern, die jeder eine Favoritenliste von Videos haben, die es in dieser Videothek gibt. Kann sein, dass das schon das richtige Modell für dich ist, und du nur noch die ... in meinem Gerüst ausfüllen musst.

    Man könnte auch weiter spekulieren, ob die Nutzer nicht ein Leben unabhängig von der Videothek führen. Sie also nicht Teil der Videothek sind, sondern Teil einer größeren Welt, in der es viele Nutzer und viele Videotheken gibt, und ein Nutzer kann Kunde mehrerer Videotheken sein, und hat für jede Videothek, bei der er Kunde ist, seine eigenen Favoriten. Das will ich jetzt nicht alles vormachen, kannst du aber zur Übung versuchen. Ist nicht soooo schwer, aber schon ein Stück anspruchsvoller als das erste Gerüst. Kann halt auch sein, dass du dieses komplexere Modell brauchst für dein Programm. Kommt halt drauf an, was genau dein Programm am Ende umsetzen können soll.



  • @SeppJ danke, dass du dir die Zeit nimmst. Ich habe bis jetzt wirklich viel gelernt!

    Um das aufzusaugen, was du mir hier beibringst versuche ich Step-by-Step vorzugehen.

    Benutzer newBenutzer(id);
            list.push_back(newBenutzer);
    

    Ich dachte, dass ich hier einen Benutzer erzeuge, der die ID der zuvor eingegeben Nummer übernimmt und sie dann in Zeile 2 per push_back als Speicher dem Benutzer zuweist.

    • Da lag ich wohl komplett falsch.
    class User
    {
       vector<int> favorite_video_catalog_numbers;
      ...irgendwie die Favoritenliste füllen...
    };
    
    

    Wenn ich das richtig hier verstehe legst du für die Klasse Benutzer einen Vektor vom Typ Int an.
    Ich dachte, dass man einen Vektor vom Typ Video anlegen muss?
    Warum muss man das nicht jetzt schon in der Klasse Benutzer machen?

    Aber ich verstehe jetzt mehr das Prinzip der Klassen. Im Endeffekt ist die Klasse "Videothek", die Klasse, die tatsächliche die Baupläne der Klasse Video und Benutzer auch umsetzt und ausführt, richtig?

    void Benutzer::fillFavourite( vector<int> favoritenliste) {
        
        int id;
        
        cout << "Wie viele Filme moechtest du deiner Liste hinzufuegen?";
        int favouriteSize;
        cin >> favouriteSize;
        
        for (int i = 0; i < favouriteSize; i++) {
            
            cout << "Bitte die ID des Films eingeben: ";
            cin >> id; 
            
            
        }
    
    

    Minimal den Code geändert würde der Code hierbei zum Erzeugen einer Favoritenliste stimmen.
    Ich müsste lediglich die Funktion so erweitern, dass nicht ein Benutzer aus einer Katalognummer erzeugt wird, sondern eine ID aus einem Benutzer heraus erzeugt wird. Es darf allerdings keine "unechte" Katalognummer sein, die gar nicht existiert.
    Wenn ich jetzt den Benutzer die Eingabe ermögliche, die Anzahl der Katalognummern, die er in seine Liste mit aufnehmen möchte, ermögliche und er eine gewisse Anzahl eingibt, muss ich hierbei auch überprüfen, ob es die Nummer tatsächlich gibt - oder denke ich an dem Punkt für die Klasse Benutzer zu weit?
    Würde eine einfache Funktion, die dem Benutzer ermöglicht, eine Anzahl an Katalognummern aussuchen und zu speichern ausreichen?



  • vielleicht solltest du mal die grundlagen objektorientierter programmierung lernen und dir danach ein buch kaufen, das dir c++ beibringt...... 🙄



  • @Wade1234
    Ich schaue mir schon seit Wochen YouTube Tutorials an, lerne mit Büchern, was mir fehlt sind Erklärungen wie @SeppJ sie formuliert.
    Durch ihn konnte ich bis jetzt gewisse Aspekte viel klarer verstehen als durch manche Bücher



  • @Suprax und du weißt, was objektorientierte programmierung ist? objekte, vererbung, komposition, aggregation, generalisierung, spezialisierung, usw.? allgemein ist das ziemlich übel trockener stoff, den du vorher lernen und üben solltest.



  • @Wade1234
    Ja, weiß ich. Ich habe angefangen Informatik zu studieren und dort bin ich auch in sogenannten „offenen Laboren“ und löchere dort Tutoren mit meinen Fragen 😃

    Deswegen habe ich mich hier registriert um genau meine Probleme und Unverständnis offen zu legen und auch von euch unterrichtet zu werden. Ich hoffe auf bisschen Geduld von den Mitgliedern und darauf hier noch unterrichtet zu werden



  • Wie wäre es wenn du dir ein gutes Buch kaufst? Mit Nachfragen kommst du nicht immer weiter. Es gibt Gebiete in C++ die du so vielleicht nicht kennenlernst und du kannst keine Fragen zu Themen stellen von denen du nichtmal weißt, dass es sie gibt. Ein gutes Buch wird dich Stück für Stück aufklären und da kommts garnicht erst zu solchem Code wie oben. Da lernst du es von Anfang an richtig. Wenn du dann noch Fragen hast die du nach ausführlicher Google-Recherche nicht selbst beantworten kannst, wird dir hier sicher gern weiter geholfen 🙂



  • @Zhavok

    Ich habe das Buch von Bjarne Stroustrup „Einführung in die Programmierung C++“.

    Aber solche Lücken, die ich aufweise, werden in dem Buch oftmals nur schwer verständlich vermittelt. Viele Preisen das Buch, ich finde es an sich auch nicht schlecht, aber die Basics werden für einen Anfänger irgendwie schwer vermittelt

    #edit: Ich muss ja noch nicht direkt im ersten Semestef C++ voll drauf haben. Das wäre auch stark unrealistisch.
    Aber was ich hier mache dient der Klausurvorbereitung und da sollte ich zumindest mal Klassen aufstellen und entsprechende Funktionen schreiben können



  • Häufig helfen Bücher erst, wenn man schon Basics kennt. Basis aus Büchern zu lernen, finde ich schwierig. Reine Einsteigerbücher sind oft schlecht.

    Daher erstmal ein bisschen rumprobieren. Natürlich nicht ganz wahllos!

    Aber für den Anfang hilft häufig ein bisschen gesunder Menschenverstand:

    Was ist ein Video? Was sind die Eigenschaften eines Videos? Damit hast du schon eine erste Idee, wie deine Klasse "Video" aussehen sollte.

    Dann machst du weiter: was macht eine Videothek aus?

    Was macht einen Person aus, die in einer Videothek etwas ausleiht? Nun stellst du fest, dass "Person, die in einer Videothek was ausleiht" kein geeigneter Klassenname ist. Ist zu kompliziert. Also vielleicht: "Kunde"? Oder "Person"? Eine Person könnte Kunde mehrer Videotheken sein usw. Und dann wird es schwieriger.

    Ich dachte, dass ich hier einen Benutzer erzeuge, der die ID der zuvor eingegeben Nummer übernimmt

    Danach sieht es aus. Aber Benutzer(ID) sollte einen Benutzer mit einer Benutzer-ID erzeugen.

    und sie dann in Zeile 2 per push_back als Speicher dem Benutzer zuweist.

    Den Satz verstehe ich nicht. Du kopierst damit "newBenutzer" in die Liste von Videos. Ein Benutzer ist aber kein Video. Das geht also nicht.

    Außerdem: der Name "list" ist schlecht. Unter einer Liste würde man leicht eine std::list vermuten. Nenne sie lieber nach dem Inhalt, aber als Plural. Also zum Beispier "users" für einen std::vector<User> oder "videos" für einen std::vector<Video> (sofern du nicht mehrere solche Variablen hast, dann brauchst du noch bessere Namen).



  • Hallo zusammen. Danke für eure Kritik und Verbesserungsvorschläge. Ich habe mich nochmal rangesetzt und versucht den Code so einfach wie möglich, und das ohne Zeiger, zu strukturieren.

    Meine Erfolge:

    Benutzer.cpp

    Benutzer::Benutzer() { }
    
    Benutzer::Benutzer(string u, string pw) : user(u), password(pw) {}
    
    Benutzer::~Benutzer() {}
    
    
    void Benutzer::setCurrent_video(int current_video) { //kann sich aendern, guckt nicht nur ein Video, sondern mehrere
        
        this->current_video = current_video; 
    }
    
    
    string Benutzer::get_User() const {
        
        return user; 
    }
    
    string Benutzer::get_Password() const {
        
        return password; 
    }
    
    void Benutzer::print() {
    
        
            cout << "Benutzer-ID: " << user << endl << "Passwort: " << password << endl;
    }
    
    void Benutzer::fillFavourite(int id) {
        
        this->myFavourite.push_back(id); //ich lege in meinen Vektor myFavourite jedesmal die ID 
          
        
    }
    

    OnlineVideothek

    OnlineVideothek::OnlineVideothek() {}
    
    OnlineVideothek::~OnlineVideothek() {}
    
    void OnlineVideothek::createUser(string name, string password) {
        
        //Alternative
        /*Benutzer b(name, password); 
        this->users.push_back(b);*/
        
        bool notFound = true;
        for (unsigned int i=0; i < users.size(); i++) {
            
            if ( name == users.at(i).get_User() ) {
                
                cout << "Name ist bereits belegt!";
                notFound = false;
                break;
            }
        }
        if(notFound)
        {
            this->users.push_back(Benutzer(name, password));
        }
    }
    
    void OnlineVideothek::createVideo(string title, int maxViews) {
        
        bool notFound = true;
        
        for (unsigned int i=0; i < videos.size(); i++) {
            
            if (title == videos.at(i).getTitel()){
                
                cout << "Titel ist bereits vorhanden!";
                notFound = false;
                break;
            }
        }
        
        if (notFound) {
        
            this->videos.push_back(Video(title,0,maxViews));
        
        }
    }
    
    bool OnlineVideothek::login(string name, string password) {
        
        for (unsigned int i=0; i < this->users.size(); i++) {
            
            if ( name == this->users.at(i).get_User() && password == this->users.at(i).get_Password() )
            {    
                return true;
            } 
            else 
            {
                
                return false;
            }
        }
        
        return false; 
    }
    
    void OnlineVideothek::showAllVideos() const {
        
        for (unsigned int i = 0; i < videos.size(); i++) {
            
            cout << "Video: ";
            videos.at(i).print(); 
            
        }
        
    }
    
    void OnlineVideothek::addToFavorites(string name, int id) {
        
        
        bool foundUser = false;
        bool foundVideo = false;
        int userIndex = -1;
        int videoIndex = -1;
        
        for (unsigned int i = 0; i < users.size(); i++) 
        {
            if(users.at(i).get_User() == name)
            {
                
                foundUser = true;
                userIndex = i;
                
            }
            else {
                
                throw runtime_error {"Benutzer nicht gefunden!"};
            }
        }
        
        
        for (unsigned int i = 0; i < videos.size(); i++) 
        {
            if (videos.at(i).getID() == id )
            {
                foundVideo = true;
                videoIndex = i;
            }
            else {
                
                throw runtime_error {"Video nicht gefunden!"};
            }
        }
        
        
        if (foundUser && foundVideo) 
        {
            users.at(userIndex).fillFavourite(videos.at(videoIndex).getID());
        }
    }
    

    Damit bin ich auch fast bei der Vollendung meines Übungstests, allerdings fehlt mir nur noch eine Funktion

    watch(string name, int id) 
    

    Bei der ich simulieren muss, dass der angegebene Benutzer das angebene Video anschaut. Dazu muss ich dem angegebenen Benutzer die entsprechende ID des Videos übergeben.

    Ich weiß, dass die Parameter, die hier übergeben werden, sprich string name, der Name des Users ist und int id, die ID des Videos.
    Ich habe bei Benutzer.cpp die Methode geschrieben:

    void Benutzer::setCurrent_video(int current_video) { //kann sich aendern, guckt nicht nur ein Video, sondern mehrere
        
        this->current_video = current_video; 
    }
    

    Diese Methode muss ich für meine watch-Funktion aufrufen und der Methode die ID-Nummer des Videos übergeben und die Anzahl der Zuschauer des Videos um 1 inkrementieren, da wir dadurch einen neuen Zuschauer für das Video haben.

    Mein Grundgedanke:

     
    void OnlineVideothek::watch(string name, int id) {
            
            int current_video = 0;
            int current_watching = 0; 
            bool videoFound = false;
            bool userFound = false;
            
            
            for ( unsigned int i = 0; i < this->videos.size(); i++ ) {
                
                if ( id == videos.at(i).getID() ) {
                    
                    videoFound = true; 
                    current_video = i; 
                    
                }
                
                
            }
            
            for ( unsigned int i = 0; i < this->users.size(); i++) {
                
                if ( name == users.at(i).get_User()) {
                    
                    userFound = true; 
                    current_watching = i;
                     
                    
                }
                
            }
            
            if ( userFound && videoFound )
            {
                this->users.at(current_watching).setCurrent_video(videos.at(current_video).getID());
                current_watching++; 
                 
            }  
        }
    
    

    Meine Idee dahinter ist, dass ich beide Vektoren auf den richtigen User und Video überprüfen muss und dann, wenn der richtige User und das richtige Video gefunden wurde, dann das gefundene Video, die ID, dem gefundenen User übergebe.

    #edit: Ich habe meinen Ansatz mal gepostet, wo könnte dort ein Problem entstehen oder an welcher Stelle macht das ganze keinen Sinn?


Anmelden zum Antworten