Vektor-Funktion bricht nach einer Eingabe ab



  • Ja, erst nach der Schleife gibst du false (oder eine Exception) zurück.



  • Super, habe ich geändert.
    Aber bzgl. der Rückgabe sagtest du, dass ich eine Exception werfen soll oder am besten eine konstante Referenz.

    Da müsstest du mir mal auf die Sprünge helfen. Wie würde das aus der Sicht der Syntax aussehen?



  • Das mußt dir dir ja selber überlegen, was du als Rückgabe dann verwenden willst. Bei einem Objekt oder einer (konstanten) Referenz müßtest du ja einen Standard-Benutzer (o.ä.) zurückgeben - und dann entsprechend nach dem Aufruf abfragen.
    Oder aber du nimmst einen Zeiger auf einen (konstanten) Benutzer und gibst dann nullptr zurück und fragst dementsprechend ab (andererseits sind Zeiger immer etwas unschöner zu benutzen, wegen der Dereferenzierung mittels *bzw. ->).
    Wenn du aber eher davon ausgehst, daß es eine Ausnahme ist, daß ein Benutzer nicht gefunden wird, dann würde ich die Variante mit der Exception nehmen.



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

    Das mußt dir dir ja selber überlegen, was du als Rückgabe dann verwenden willst. Bei einem Objekt oder einer (konstanten) Referenz müßtest du ja einen Standard-Benutzer (o.ä.) zurückgeben - und dann entsprechend nach dem Aufruf abfragen.
    Oder aber du nimmst einen Zeiger auf einen (konstanten) Benutzer und gibst dann nullptr zurück und fragst dementsprechend ab (andererseits sind Zeiger immer etwas unschöner zu benutzen, wegen der Dereferenzierung mittels *bzw. ->).
    Wenn du aber eher davon ausgehst, daß es eine Ausnahme ist, daß ein Benutzer nicht gefunden wird, dann würde ich die Variante mit der Exception nehmen.

    Hm, spannend. Ich habe eine andere Meinung. Für eine Funktion get_user(const string &name) - ok, die returnt einen User (Benutzer&) - fein. Aber wenn ich eine Funktion find_user habe, dann sehe ich schon im Namen, das da etwas gesucht wird, das auch mal nicht gefunden werden kann. Da würde ich grundsätzlich erwarten, dass hier irgendwas rauskommt, das ich testen muss, ähnlich wie bei std::find und Varianten. Ob es nun ein end-Iterator oder ein nullptr ist, egal.

    Daher würde ich

    Benutzer* OnlineVideothek::findUser(const string &name) {
        for (unsigned int i = 0; i < this->users.size(); i++) {
            if (this->users.at(i).get_User() == name)
                return &this->users.at(i);
        }
        return nullptr;
    }
    

    Wobei noch anzumerken wäre, dass ich die for-Schleife so nicht verwenden würde, aber das Beispiel jetzt nicht noch weiter ändern will. Die Frage ist auch, ob man nicht gleich eine map<Username, User> nehmen sollte. Im jetzigen Fall ist der Benutzer, der von dieser Funktion zurückkommt, nicht mehr gültig, wenn man eine andere Person einfügt.
    Und @Suprax, du solltest dringend den Namen der Funktion get_User überdenken! Der User ist doch schon das, was im Array users drin ist. Der sollte für den Namen eine Funktion wie get_name(), get_username() (oder ohne das get_) oder ähnlich haben! Außerdem ist es verwirrend, eine Klasse Benutzer zu haben, diesen aber mit createUser zu erstellen. Nimm einen Namen (den Englischen, wenn möglich).



  • Habs mittlerweile hinbekommen und die Fehler ausgebessert. Danke an alle!


Anmelden zum Antworten