Schleife wird nicht Zeile für Zeile abgearbeitet



  • Ich habe eine Klasse namens Buch definiert.
    Ein Buch hat einen Titel und einen Autor. Beides jeweils vom Typ String vom std. Der Konstruktor soll der Instanz die benötigten Werte anhand von Nutzereingaben durch getline() setzen.

    In der Main-Funktion habe ich nun eine Instanz (als Array) von Buch namens buch erstellt. Maximal können 100 Bücher eingelesen werden. Damit ich bis zu 100 Bücher einlesen kann, habe ich eine While-Schleife benutzt.
    Entweder ich trage alle 100 Bücher ein, oder ich beende das Programm mit einer Nutzereingabe=0. Soweit komme ich aber nicht. Er fordert mich auf erst alle 100 Bücher einzulesen und danach kriege ich 100 mal die Frage gestellt ob ich denn nun fortfahren will oder nicht. Den restlichen Code macht er überhaupt nicht mehr.

    //
    
    #include "pch.h"
    #include <iostream>
    #include <string>
    
    class Buch {
    	
    private:
    	std::string titel, autor;
    public:
    	
    	
    	
    	Buch() {
    		std::cout << "Bitte den Titel des Buchs eingeben" << std::endl;
    		std::getline(std::cin, titel);
    		
    		std::cout << "Bitte den Autor des Buchs eingeben" << std::endl;
    		std::getline(std::cin, autor);
    		
    		
    		
    	}
    	Buch(std::string titelN, std::string autorN) {
    		titel = titelN;
    		autor = autorN;
    	}
    	std::string getTitel() {
    		return titel;
    	}
    	std::string getAutor() {
    		return autor;
    	}
    	void setTitel(std::string tit) {
    		titel = tit;
    	}
    	void setAutor(std::string aut) {
    		autor = aut;
    	}
    	void printDaten() {
    		std::cout << "Titel: " << titel << std::endl;
    		std::cout << "Autor: " << autor << std::endl;
    	}
    };
    
    int main()
    {
    	int buchZaehler = 0;
    	int nutzerEingabe = 1;
    	Buch buch[100];
    	while ((sizeof(buch) / sizeof(Buch))<=100 || (nutzerEingabe==1 && sizeof(buch) / sizeof(Buch) < 100)){
    		buch[buchZaehler];
    		
    		buchZaehler++;
    		//Ab hier ignoiert der Compiler meine Anweisung und gibt diese erst am Ende aus.
    		std::cout << "Wollen Sie ein weiteres Buch eingeben? 0(Nein) ; 1(Ja)\n\n";
    		std::cin >> nutzerEingabe;
    		
    
    	}
    	for (int i = 0; i < buchZaehler; i++) {
    		buch[i].printDaten();
    		std::cout << "\n";
    	}
    	return 0;
    }
    
    
    
     ... Code ... 
    

    Ich weiß das die Bedingung für die Schleife Falsch bzw Sinnlos ist, darum geht es aber nicht.
    Ich bedanke mich für hilfreiche Antworten.



  • @alfa420 sagte in Schleife wird nicht Zeile für Zeile abgearbeitet:

    Der Konstruktor soll der Instanz die benötigten Werte anhand von Nutzereingaben durch getline() setzen.

    Ganz schlechte Idee.


  • Mod

    Geh mal mit einem Debugger Schritt für Schritt durch das Programm. Oder falls du nicht weißt, wie das geht, mach dir zwischendurch ein paar Ausgaben, damit du ungefähr weißt, wann das Programm wo ist (Und lern' schleunigst, mit einem Debugger umzugehen!). Du wirst überrascht sein, wann deine Buchabfragen geschehen. Dann verstehst du vielleicht auch, warum @Mechanics das gesagt hat, was er gesagt hat.



  • @seppj Ich habe von jemanden den Tipp bekommen, dass schon beim erstellen des Arrays der Konstruktor für jede Instanz aufgerufen wird. Mit einem Debugger zu arbeiten wäre wohl keine schlechte Idee. Vielen Dank für die Antwort.



  • @alfa420 sagte in Schleife wird nicht Zeile für Zeile abgearbeitet:

    Buch buch[100];

    Das erzeugt gleich 100 Bücher auf einmal. Vergiss erst einmal Arrays und nimm stattdessen einen std::vector<Buch>. Dann brauchst du auch keine Verrenkungen mit sizeof.../sizeof... machen, sondern der vector hat die Memberfunktion .size(), die dir die Größe angibt. Bitte. Bitte. std::vector wirst du immer brauchen. Also schnell anschauen! Die Variable buchZaehler brauchst du dann nicht mehr und die Begrenzung auf 100 Bücher ist dann auch verschwunden.

    Und ich wiederhole Mechanics' Hinweis: Die Aufgabe der Klasse Buch sollte darin bestehen, ein Buch zu kapseln. Die Aufgabe eines Buches ist nicht, dass sie irgendjemanden nach einem Buchnamen fragt und diesen dann einliest. Das soll jemand machen, der für das Einlesen zuständig ist. Also: Buch sollte den Titel und den Autor im Konstruktor übergeben bekommen. Das Einlesen sollte außerhalb der Klasse Buch geschehen, z.B. in einer separaten Funktion Buch createBuchFromUserInput() oder ähnlich.



  • @wob Vielen Dank für die ausführliche Antwort. Ich werde es mal mit std::vector versuchen. Ich hatte nur etwas angst davor und habe die C-Arrays ausprobiert. Das liegt vor allem daran, dass ich gerade von Java umsteige. Ich weiß das man eigentlich kapseln sollte, aber zur Vereinfachung habe ich es so gemacht.


Log in to reply