Buch Programm gibt meine Bücher nicht aus..



  • Gude ich hab ein Programm geschrieben welches Bücher einliest, ausgibt und anzeigt das Problem ist das meine Methode buch_anzeigen() nicht funktioniert in der main cpp zeile (57). 😞

    //main cpp

    #include <iostream>
    #include "buch.h"
    using namespace std;
    
    int main() {
    
    
        char input;
        string buch_title;
        string buch_autor;
        int buch_jahr;
        int buch_seitenanazahl;
        string buch_kategrorie;
        buch buch_1;
    
        do {
        cout << "Willkommen in Adeeb-Buecherei " << endl;
        cout << "Folgende Menuepunkte stehen sie zu verfuegung: " << endl;
        cout << "(h) Buch hinzufuegen  " << endl;
        cout << "(l) Buch loeschen " << endl;
        cout << "(a) Buch ausgeben " << endl;
        cin >> input;
    
    
        switch (input) {
    
            case 'h':{
    
                cout << "Bitte geben Sie den Buchtitel: " << endl;
                cin >> buch_title;
    
                cout << "Bitte geben Sie den Buchautor aus: " << endl;
                cin >> buch_autor;
    
                cout << "Bitte geben Sie Buchjahr ein: " << endl;
                cin >> buch_jahr;
    
                cout << "Bitte geben Sie Buchseitenzahl ein: " << endl;
                cin >> buch_seitenanazahl;
    
    
                cout << "Bitte geben Sie Buchkategorie ein: " << endl;
                cin >> buch_kategrorie;
    
    
    
                //Objekt erstellt von dem TYP buch damit man in dem Kosntruktor hinzufügen kann
    
                buch A (buch_title, buch_autor, buch_jahr, buch_seitenanazahl, buch_kategrorie);
               // A.buch_hinzufuegen(buch_1);
                //ich will das objekt buch in dem A speichern
                buch_1.buch_hinzufuegen(A);
            }break;
    
            case 'a':{
    
                buch_1.buch_ausgeben();
            }break;
    
            case 'x':{
    
                break;
            }
        }
    
        }while(input!= 'x');
    
    
        return 0;
    }
    

    buch header:

    
    #ifndef UNTITLED_BUCH_H
    #define UNTITLED_BUCH_H
    #include <iostream>
    #include <string>
    #include<vector>
    using namespace  std;
    
    class buch {
    
    private:
        string titel;
        string autor;
        int jahr;
        int seitenaznahl;
        string kategorie;
    
    
    public:
        //standartkonstruktor
        buch();
    
        //Allgemeiner Konstruktor
        buch(string Titel, string Autor, int Jahr, int Seitenanzahl, string Kategorie);
    
        //kopie-Konstruktor
    
        //Methoden
        void buch_hinzufuegen(buch a);
        void buch_ausgeben();
        void buch_loeschen(buch a);
        void print();
    
        //vektor()
        vector<buch> B;
    
    };
    
    
    #endif //UNTITLED_BUCH_H
    
    

    buch cpp:

    
    #include "buch.h"
    #include<iostream>
    using namespace std;
    
    
    //Standartkonstruktor
    buch ::buch() {
    }
    
    
    //Inizialsierungsliste(Allgemeine Konstruktor) //Der titel ist das was ich übergeben werde Title unsw
    buch ::buch(string Titel, string Autor, int Jahr, int Seitenanzahl, string Kategorie):
    titel(Titel), autor(Autor), jahr(Jahr), seitenaznahl(Seitenanzahl), kategorie(Kategorie){}
    
    //Kopierkonstruktor();
    
    //Methoden
    
    void buch ::print() {
    
    
        cout << "Buchtitel lautet: " << titel << endl;
        cout << "Buchautor lautet: " << autor << endl;
        cout << "Buchjahr lautet: " << jahr << endl;
        cout << "Buchseitenanzahl lautet: " << seitenaznahl << endl;
        cout << "Buchkategorie lautet: " << kategorie << endl;
    }
    
    
    void buch::buch_hinzufuegen(buch a) {
    
        for (int i = 0; i < B.size(); i++) {
    
            B.push_back(a);
        }
    }
    
    void buch ::buch_ausgeben() {
    
        for (int i = 0; i < B.size(); i++) {
    
            B[i].print();
        }
    }
    


  • Oha...

    1. Niemals (!!) globales using namespace in Headerdateien benutzen, das führt alle Namespaces ad absurdum.
    2. Warum besitzt deine Buch-Klasse einen Vektor mit Büchern? Entweder du führst einen separaten Vektor mit Büchern oder baust dir eine Bibliothek- Klasse, in der du Bücher verwaltest. In der Klasse Buch hat das jedenfalls nichts zu suchen.

    Beschreib´ mal, was die buch_hinzufuegen()Funktion tut (was sie tatsächlich tut, und nicht was sie tun soll), vielleicht kommste dann von alleine drauf.

    Und:
    "das Problem ist das meine Methode buch_anzeigen() nicht funktioniert in der main cpp" ist keine gute Fehlerbeschreibung. Wir wissen nicht, was nicht funktioniert, am Besten du beschreibst, was du erwartest und was dein Programm wirklich ausgibt, dann weiß man wenigstens in etwa, auf was man gucken muss.

    PS:
    Sind die ganzen Leerzeilen Absicht?



  • Dein Fehler liegt schon im Design: was ist ein Buch, was sind die Eigenschaften eines Buches? Offenbar sind das doch Dinge wie Titel, Autor, Jahr etc, aber bei dir gehört auch noch eine Liste von Büchern zur Eigenschaft eines (jeden) Buches. Das passt doch nicht. Warum hat jedes Buch noch einmal eine Liste von Büchern als Member? Das würde nur im Kontext von "Verweise auf andere Bücher" möglicherweise Sinn ergeben (aber dann vmtl. eher als Pointer oder über irgendeinen unique key). Deine Bücherliste muss separat anderswo gehalten werden. Ein einzelnes Buch sollte nicht die Bücherliste kennen.

    Edit: @DocShoe war schneller und ausführlicher.



  • @wob hmm wie würdest du es den lösen?



  • @DocShoe

    1. Alles Klar!!!
    2. ich muss das eigentlich mit eine Separaten klasse Bibliothek machen wusste nicht genau wie ich es machen soll deswegen habe ich es so gemacht
      außerdem hatte ich die Auswahl zwischen einem Vector und einer Klasse Bibliothek...
      Hab mich für den Vektor entschieden wie würdest du du es mit einer Klasse machen?


  • Na den std::vector<Buch> zum Beispiel in das main verschieben. Das ist dann deine "Bibliothek". Du brauchst da erstmal nichts weiter zu machen. Nur in deiner Modellierung hatte jedes Buch eine eigene Bibliothek. Das ergibt keinen Sinn. Ein Buch hinzufügen ist ein einfaches buecher.push_back(buch);. Keine Schleife benötigt. Warum hast du Schleifen, um die Frage von @DocShoe aufzugreifen?



  • @adii950

    Ich würd´ so anfangen:

    #include <vector>
    
    #include "buch.h"
    
    bool add_book( std::vector<Buch>& lib )
    {
       // Code zum Einlesen der Buchdaten von der Konsole
       // Rückgabe true bei Erfolg, ansonsten false
    }
    
    bool remove_book( std::vector<Buch>& lib )
    {
       // Code zum Einlesen der Kriterien zur Identifikation des zu löschenden Buches (Index, Name, etc)
       // Rückgabe true bei Erfolg, ansonsten false
    }
    
    void print_books( std::vector<Buch> const& lib )
    {
       // Code zum Auflisten der Bücher
    }
    
    int main()
    {
       std::vector<Buch> library;
     
       // Hauptmenü hier oder von mir aus auch in einer eigenen Funktion
    }
    

    Ich hoffe, wob stimmt mir da zu 😉

    PS:
    Deutsche Namen sind hässlich



  • @DocShoe sagte in Buch Programm gibt meine Bücher nicht aus..:

    Ich hoffe, wob stimmt mir da zu

    Generell ja. Wobei ich beim add_book lieber noch eine getrennte Funktion hätte, die mir einfach nur das Buch von Konsole einlist und ein Buch-Objekt zurückgibt. Dann ist das add_book nur noch library.push_back(book). Ich denke, dass es wichtig ist, Einlesen von der eigentlichen Funktionalität zu trennen. Das macht die Funktion void add_book( std::vector<Buch>& lib, const Buch &buch) dann auch gleich testbar. Nur dass diese hier eben ein Einzeiler ist.

    Und wenn du schon viele Funktionen hast, die den vector<Buch> als ersten Parameter nehmen, dann klingt das ja schon fast nach Methoden einer Klasse...



  • @wob stimmt hast recht jetzt klappt es auch danke dir 🙂


Log in to reply