Klassendesign/Datenbank - Objekte zu einem Objekt hinzufügen



  • Guten Tag,

    ich habe ein Verständnis Problem bei der Objektorientierung. Das Problem bezieht sich auf eine Hausaufgabe zur Vererbung deren Abgabe aber schon vorbei ist.

    Die Aufgabe war ein Bibliothekssystem zu erstellen. In Diesem System gibt es Studenten und Mitarbeiter (Unterklasse von User) und Bücher sowie CDs/DVDs (Unterklassen von Materialien).

    Dazu einige Bedingungen wie 30 Tage Leihfrist ansonsten Gebühren usw.

    Bis zu diesem Punkt ist mir soweit alles klar. Mein Verständnisproblem bezieht sich nun auf die Möglichkeit während des Programmablaufes neue Bücher hinzuzufügen und zu den bereits bestehenden weitere Exemplare hinzuzufügen.

    Zum einen weiß ich nicht wie es möglich ist während des Programmablaufs ein neues Objekt zu erzeugen – da ich dazu ja den eine Variable mit einem Namen vorher wissen müsste – aber ich weiß ja nicht wie viele neue Objekte von Büchern erzeugt werden sollen. Denkbar wäre ein Array welches immer erweitert wird aber ich weiß nicht genau wie ich die Beziehung Student – Bücher implementiere. Zum anderen ist die Aufgabe weitere Exemplare zu einem bereits bestehenden Buch hinzufügen – dadurch würde, wenn ich vorher schon ein Array Benutzen würde ein unterschiedlich langes mehrdimensionales Array für die Bücher genutzt werden – auch da weiß ich nicht genau wie ich diese Struktur sinnvoll implementieren kann.

    In den bisherigen und danach folgenden Aufgaben hatte ich meist die volle Punktzahl und habe es auch super verstanden aber an diesem Punkt des Klassendesigns zerbreche ich mir irgendwie den Kopf.
    Ich denke da auch wahrscheinlich nur zu kompliziert und man kann das ganze deutlich simpler implementieren.

    Für einen Hinweis oder einen Verweis zu einem ähnlichen Beispiel was ich mir zum Verständnis anschauen könnte wäre ich sehr dankbar - sofern es nur Grundtechniken ohne vectoren oder so beinhaltet.

    (Falls gewünscht kann ich auch die Aufgabe dazu Posten)

    Gruß,
    Dentho



  • Mich würde dein Lösungsansatz interessieren, denn eigentlich ist hier nichts kompliziertes dabei wo ich sofort sagen würde: das ist die Hürde an der du hängst.



  • dentho schrieb:

    ...sofern es nur Grundtechniken ohne vectoren oder so beinhaltet.

    Damit hast du leider verloren. Du brauchst vector, und vielleicht noch map. Wenn du vector nicht benutzen darfst implementiere die Klasse Vektor oder DynArray, die genau dasselbe wie vector tut.

    vector<Book> books;
    //neues Buch machen:
    books.emplace_back("Titel", 1982 /*Erscheinungsjahr*/); //hier tust du dasselbe hin als würdest du ein Buch definieren.
    //User sind etwas tricky wegen Vererbung:
    vector<unique_ptr<User>> users;
    //neuen User machen:
    users.push_back(unique_ptr(new Student("name")); //das geht hübscher, weiß nur gerade nicht wie
    //vielleicht willst du sowas hier:
    vector<unique_ptr<User>, vector<Book>> ausleihungen;
    /* Das ist eine Liste von Nutzern und jeder Nutzer hat eine Liste von ausgeliehenen Büchern. */
    //vielleicht noch das Ausleihdatum:
    vector<unique_ptr<User>, vector<pair<Book, time_t>>> ausleihungen;
    //Eine Liste von Nutzern und jedem Nutzer zugehörig eine Liste mit Büchern und Ausleihdatumsen. Die Idee sollte klar werden.
    

    Ist ganz einfach, man kann direkt hinschreiben was man will. Wenn ihr das nicht benutzen dürft tust du mir leid, das wird eine langwierige Fleißarbeit die Standardbibliothek nachzuprogrammieren wenn du es richtig und fehlerfrei machen willst. Alternativ kannst du natürlich auch C schreiben und mit Pointern rumfrickeln, aber das dauert sehr viel länger und wird nicht fehlerfrei.



  • Ich habe die entsprechenden Klassen geschrieben und im Hauptprogramm erstelle ich – im Moment halt noch von Hand selber – 2 Objekte der Buch Klasse und ein Objekt der Student Klasse.

    In der Student Klasse habe ich eine Funktion borrowItem welches ein Objekt der Oberklasse Materialien als Parameter entgegennimmt.

    Student hat ein Array vom Typ Materialien mit einer größte von 10 (das ist die maximale Anzahl an Materialien die ein Student sich gleichzeitig ausliehen darf).

    Die Funktion borrowItems überprüft nun ob noch Platz ist und wenn ja fügt es das übergebene Objekt an den freien Platz hinzu.
    Bei der Rückgabe passiert dasselbe nur Umgekehrt.

    Sofern ich vorher die Objekte von Hand erstelle und dann selber Übergebe klappt das aber wie gesagt versteh ich nicht ganz wie ich das Dynamisch lösen soll und wie ich mit mehreren Exemplaren desselben Buch Objekts (3x der Hobbit, 1x C++ usw.) umgehen soll.



  • @nwp3
    Deswegen habe ich ja die Vermutung das es irgendwie einfacher gehen muss - es wird wohl kaum Verlangt werden in der Klausur die STL nachzuprogrammieren. Und bei meinem letzten Einsatz von vectoren gab es 20 Punkte Abzug weil keine Arrays verwendet wurden.



  • dentho schrieb:

    Und bei meinem letzten Einsatz von vectoren gab es 20 Punkte Abzug weil keine Arrays verwendet wurden.

    *prust*
    Ich brauch mehr Drogen...
    🙂



  • Dem kann ich mich nur anschließen, das ist echt traurig. Du hast leider schon mehr Ahnung von C++ als dein Lehrer. Du kannst die Frage im C-Forum nochmal stellen, vielleicht hilfts. Ansonsten verlier den Mut nicht, es kann nur besser werden.



  • dentho schrieb:

    Sofern ich vorher die Objekte von Hand erstelle und dann selber Übergebe klappt das aber wie gesagt versteh ich nicht ganz wie ich das Dynamisch lösen soll und wie ich mit mehreren Exemplaren desselben Buch Objekts (3x der Hobbit, 1x C++ usw.) umgehen soll.

    std::vector - löst dein Problem. Wenn das deinem Professor nicht passt, wird er etwas anderes stattdessen haben wollen - einfach mal nachfragen. Was du verwendest ist egal - notfalls eben ein fixes array in eine Klasse wrappen.

    Aber dynamische Modelle ohne dynamische Strukturen zu implementieren ist langwierig und fehleranfällig.

    Mehrmals das selbe Buch kannst du auf 2 Arten lösen. Eine Lösung ist einfach eine clone() Funktion in Materialien anbieten, dass von den Kindklassen implementiert wird um ein Material wirklich klonen zu können. Oder deine Verwaltungsklasse hat einen Zähler der weiß wie oft ein Material vorhanden ist.


Anmelden zum Antworten