Nach Übergabe eines Objektes via Reference leere Variaben



  • Hallo zusammen,

    bezüglich einer Aufgabe aus meinem Informatik Studium sitze ich bereits seit einigen Stunden an dem Problem, das mein Programm mir bei der Methode "addBook" in der Klasse "Student" keine Werte aus dem Übergebenen Objekt mitgibt. Wenn ich das Programm also ausführe bekomme ich nur leere Resultate von m_title, m_author und m_isbn zurück, obwohl diese in der Main Methode gespeichert werden. Wäre echt super wenn mir jemand zeigen oder einen Hinweis geben könnte, was genau ich da in der Methode addBook, oder vielleicht in der Klasse Book falsch gemacht habe.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Book {
    	string m_title;
    	string m_author;
    	string m_isbn;
    
    public:
    
    	Book(string title, string author, string isbn) {
    		this->setTitle(title);
    		this->setAuthor(author);
    		this->setISBN(isbn);
    	}
    
    	string getTitle() { return this->m_title; }
    	string getAuthor() { return this->m_author; }
    	string getISBN() { return this->m_isbn; }
    	void setTitle(string title) { this->m_title = title; }
    	void setAuthor(string author) { this->m_author = author; }
    	void setISBN(string isbn) { this->m_isbn = isbn; }
    };
    
    class Student {
    	// array der geliehenen Buecher
    	Book* m_book[8];
    
    public:
    	Student() {
    		for(int i = 0; i < sizeof(m_book); i++) {
    			m_book[i] = NULL;
    		}
    	}
    
    	~Student() {
    		for(int i = 0; i < sizeof(m_book); i++) {
    			if(m_book[i] != NULL) {
    				delete(m_book[i]);
    				m_book[i] = NULL;
    			}
    		}
    	}
    
    	void addBook(Book& book) {
    		for(int i = 0; i < sizeof(m_book); i++) {
    			if(m_book[i] == NULL) {
    				m_book[i] = new Book(book.getTitle(),book.getAuthor(),book.getISBN());
    				i = sizeof(m_book);
    			}
    		}
    	}	
    
    	void printBooks() {
    		cout << "Ausgeliehene Bücher:\n";
    		for(int i = 0; i < sizeof(m_book); i++) {
    			if(m_book[i] != NULL) {
    				cout << "[Buch " << i << "] Titel: " << m_book[i]->getTitle() << "\nAutor: " << m_book[i]->getAuthor() << ", ISBN: " << m_book[i]->getISBN() << "\n";
    			}
    		}
    	}	
    };
    
    /** Dieser Bereich ist vorgegeben und darf nicht verändert werden. */
    int main(int argc, char* argv[])
    {
    	Book book_1("Introduction to Algorithms",
    	            "Th. Cormen, Ch. Leiserson, R. Rivest", 
    	            "0262531968");
    
    	Student student;
    	student.addBook(book_1);
    	student.printBooks();
    
    	return 0;
    }
    


  • Laß dir mal "sizeof(m_book)" ausgeben - da kommt nicht 8 bei raus.
    Dadurch iterieren die Schleifen über nicht zugewiesenen Speicher - und das ist UB (undefined behaviour)!

    Kennst du schon vector<T>?


  • Mod

    Deine dynamische Speicherverwaltung und Pointerfrickelei ist in jedweder Hinsicht falsch. Falls es in der Aufgabenstellung nicht um dynamische Speicherverwaltung Pointerfrickelei ging: Lass es einfach bleiben. Nutz std::vector oder ähnliche Container und das Problem löst sich selber.

    Falls es um dynamische Speicherverwaltung und Pointerfrickelei ging:
    1. Trenne Zuständigkeiten. Du bist Student, oder? Hast du in deiner Rolle als Student schon einmal dynamischen Speicher für deine Bücher verwaltet? Nein, oder? Wieso macht das dann deine Studentenklasse?
    2. Folgerung aus 1.: Programmier stattdessen std::vector oder ähnliche Container nach. Die machen dann die dynamische Speicherverwaltung und Pointerfrickelei. Der Student benutzt sie als Container für seine Bücher.
    3. Um 2. richtig umsetzen zu können, musst du mindestens die Regel der großen Drei kennen. Man sollte meinen, dass dies die erste Lektion bei dynamischer Speicherverwaltung wäre, daher vermute ich mal, dass es bei der Aufgabenstellung vielleicht doch nicht darum geht und du eventuell bloß noch nie von std::vector oder ähnlichen Containern gehört hast 😮



  • Vielen vielen Dank an euch beide,
    das Problem liegt tatsächlich am sizeof(), ich habe es jetzt so gelöst das ich im Constructor von Student ein Attribut m_bookSize definiere, inder ich die größe des Arrays mit sizeof(m_book) / sizeof(m_book[0]) darin speichere, und diese dann überall einsetze. Ihr habt mir sehr geholfen.

    @SeppJ: Leider ist es von der Aufgabenstellung schon genauso gewollt wie im Code angegeben, insbesondere mit der ganzen Pointerfrickelei. Ich hätte allerdings im Programm die Länge der Schleife fest definieren dürfen, wollte es aber Dynamischer machen und hab nicht gemerkt das genau dort der Fehler lag. (Hab mir den Befehl sizeof zu schnell aus dem Internet gezogen ohne mich genauer darüber zu Informieren).


  • Mod

    Das sizeof ist nicht dein einziger Fehler. Die anderen magst du derzeit nicht bemerken, sie sind aber immer noch da. googel mindestens mal das Stichwort zur Regel der großen Drei. Das ist absolute Grundlage, wenn man Ressourcenverwaltung betreibt.


Anmelden zum Antworten