Aufgabe 18d
Schwierigkeitsgrad: Einfach
Themen: Objektorientierung Standardbibliothek
- Aufgabenstellung
- Lösung
Schreiben Sie eine Klasse Player. Die Anforderungen an einen Player sind:
- Merken des aktuellen Zustandes (Play, Pause, Stop)
- Verwalten von abzuspielenden Tracks in einer sinnvollen Datenstruktur
- Ausgabe des aktuellen Zustandes des Players
- Kontrolle über die Musik (Play, Pause, Stop, Skip)
- Hinzufügen von Tracks um diese abzuspielen
- Hinzufügen von Playlists um deren Inhalt abzuspielen
- Verwalten und abrufen von mehreren Playlists anhand ihrer Namen
Implementieren Sie diese Anforderungen mithilfe von Membervariablen und Methoden. (Testen Sie anschließend ihren Code mithilfe der bereitgestellten main.cpp. Diese prüft grundlegende Fehler. Überlegen Sie sich gegebenenfalls, wie Sie ihr Programm noch ändern müssen um andere Fehlerquellen auszuschließen.)
player.hpp
#pragma once
#include <iostream>
#include <queue>
#include <map>
#include "playlist.hpp"
class Player {
private:
std::queue<Track> queue;
std::map<std::string, Playlist> playlists;
bool playing;
bool paused;
void print() const;
Track get_currently_playing() const;
public:
Player();
void start_playback();
void stop_playback();
void pause_playback();
void skip();
void add_to_queue(const Track& track);
void add_to_queue(Playlist& playlist);
void add_to_queue(std::string& playlist);
void add_playlist(Playlist& playlist);
};
player.cpp
#include "player.hpp"
Player::Player(): playing(false), paused(false), queue(std::queue<Track>()), playlists(std::map<std::string, Playlist>()) {
this->print();
}
void Player::start_playback() {
if (this->queue.empty())
throw std::logic_error("Die Warteschlange ist leer.");
this->playing = true;
this->paused = false;
this->print();
this->queue.pop();
}
void Player::stop_playback() {
this->playing = false;
this->paused = false;
this->print();
}
void Player::pause_playback() {
this->playing = false;
this->paused = true;
this->print();
}
void Player::skip() {
this->queue.pop();
this->start_playback();
}
Track Player::get_currently_playing() const {
if (this->playing || this->paused)
return this->queue.front();
else
throw std::logic_error("Gestoppt.");
}
void Player::add_to_queue(const Track& track) {
this->queue.push(track);
}
void Player::add_to_queue(Playlist& playlist) {
for (int i = 0; i < playlist.get_length(); i++)
this->add_to_queue(playlist.get_track(i));
}
void Player::add_to_queue(std::string& playlist) {
this->add_to_queue(this->playlists.at(playlist));
}
void Player::add_playlist(Playlist& playlist) {
this->playlists.insert({playlist.get_name(), playlist});
}
void Player::print() const {
if (this->queue.size() <= 0) std::cout << "Die Warteschlange ist leer.\n";
if (this->playing) {
std::cout << "Spielt jetzt:\n";
std::cout << this->get_currently_playing();
}
else {
if (this->paused) {
std::cout << "Pausiert:\n";
std::cout << this->get_currently_playing();
}
else
std::cout << "Gestoppt.\n";
}
std::cout << "-------------------------\n\n";
}