Aufgabe 18b
Schwierigkeitsgrad: Einfach
Themen: Objektorientierung Standardbibliothek
- Aufgabenstellung
- Lösung
Schreiben Sie eine Klasse Playlist. Die Anforderungen an eine Playlist sind:
- Abspeichern von Tracks in einer sinnvollen Datenstruktur
- Hinzufügen von Tracks
- Löschen von Tracks anhand ihrer Position in der Playlist und anhand eines vergleichbaren Track Objektes
- Auslesen eines Tracks anhand dessen Position in der Playlist und anhand des Titles. Hierbei soll der Rest der Playlist nicht verändert werden.
- Auslesen der Länge und des Namens der Playlist. Hierbei soll die Playlist nicht verändert werden.
Implementieren Sie diese Anforderungen mithilfe von Membervariablen und Methoden.
playlist.hpp
#pragma once
#include <list>
#include "track.hpp"
class Playlist {
private:
std::string name;
std::list<Track> tracks;
public:
Playlist(std::string name);
void add_track(Track& newTrack);
void remove_track(Track& track);
void remove_track(int& pos);
Track get_track(int& pos) const;
Track get_track(std::string& title) const;
int get_length() const;
std::string get_name() const;
};
playlist.cpp
#include "playlist.hpp"
Playlist::Playlist(std::string name): tracks(std::list<Track>()), name(name) {
}
void Playlist::add_track(Track& newTrack) {
this->tracks.push_back(newTrack);
}
void Playlist::remove_track(Track& track) {
this->tracks.remove(track);
}
void Playlist::remove_track(int& pos) {
if (pos > this->get_length()) throw std::out_of_range("Index out of range.");
int c = 0;
for (auto it = this->tracks.begin(); it != this->tracks.end(); ++it) {
if (c == pos)
this->tracks.remove(*it);
c++;
}
throw std::invalid_argument("Not a valid position");
}
Track Playlist::get_track(int& pos) const {
if (pos > this->get_length()) throw std::out_of_range("Index out of range.");
int c = 0;
for (auto it = this->tracks.begin(); it != this->tracks.end(); ++it) {
if (c == pos)
return *it;
c++;
}
throw std::invalid_argument("Not a valid position");
}
Track Playlist::get_track(std::string& title) const {
for (auto it = this->tracks.begin(); it != this->tracks.end(); ++it) {
if (it->get_title() == title)
return *it;
}
throw std::invalid_argument("A song with this title does not exists in this playlist.");
}
int Playlist::get_length() const {
return this->tracks.size();
}
std::string Playlist::get_name() const {
return this->name;
}