Gorąco jest, nudzi mi się ;). Chociaż pewnie prawda jest taka, że nie znając C++ i paradygmatów programowania obiektowego jedyne, co jesteś póki co w stanie zrobić to zamienić w swoim programie słówko struct
na class
i char x[]
na std::string
. Do nauki samej w sobie polecam zaopatrzenie się w podręcznik.
Ew. pytaj o konkretne rzeczy w kodzie poniżej. Starałem się pokazać jak najwięcej rzeczy różniących C i C++.
#include <iostream>
#include <vector>
#include <iterator>
#include <sstream>
#include <iomanip>
#include <numeric>
class Track
{
private:
std::string _title;
int _length;
public:
Track(const std::string& title, int length) : _title(title), _length(length) { }
Track(const std::string& title, const std::string& length) : _title(title)
{
std::istringstream sstream(length);
int minutes, seconds;
char separator;
sstream >> minutes >> separator >> seconds;
_length = minutes * 60 + seconds;
}
const std::string& GetTitle() const
{
return _title;
}
int GetLength() const
{
return _length;
}
friend std::ostream& operator<<(std::ostream& stream, const Track& track)
{
stream << std::setw(50) << std::left << track._title << track._length << "s";
return stream;
}
};
class Album
{
private:
std::string _title;
std::string _artist;
int _releaseYear;
std::vector<Track> _tracks;
public:
typedef std::vector<Track>::iterator TrackIterator;
Album(const std::string& title, const std::string& artist, int releaseYear) :
_title(title), _artist(artist), _releaseYear(releaseYear) { }
// akcesory analogicznie do klasy Track + np. wystawienie iteratorów do wektora
int GetLength() const
{
return std::accumulate(_tracks.begin(), _tracks.end(), 0, [] (int sum, const Track& track) {
return sum + track.GetLength();
});
return 0;
}
void AddTrack(const Track& track)
{
_tracks.push_back(track);
}
template<typename T>
void AddTracks(T first, T last)
{
std::copy(first, last, std::back_inserter(_tracks));
}
friend std::ostream& operator<<(std::ostream& stream, const Album& album)
{
stream << album._title << " (" << album._releaseYear << ") by " << album._artist << std::endl;
stream << "Running time: " << album.GetLength() << "s" << std::endl;
std::copy(album._tracks.begin(), album._tracks.end(), std::ostream_iterator<Track>(stream, "\n"));
return stream;
}
};
int main()
{
Track tracks[] =
{
Track("Introduction", "0:43"),
Track("Remember the Name (ft. Styles of Beyond)", "3:50"),
Track("Right Now (ft. Black Thought & Styles of Beyond)", "4:14")
};
Album album("The Rising Tied", "Fort Minor", 2005);
album.AddTracks(tracks, tracks + 3);
std::cout << album;
return 0;
}