我制作了一个基本上只是唱片公司经理的节目(我只是为了好玩而制作东西),而且我有一些课程。到目前为止,类RecordLabel,类Rapper和类Album。这张专辑:
using namespace std;
#include <iostream>
#include <string>
class Album
{
public:
void getAlbumName() const;
string setAlbumName(string);
void getNumTracks() const;
int setNumTracks(int);
void getTracklist() const;
string setTracklist(string);
private:
string albumName;
int numTracks;
string tracklist[];
};
所以我不确定跟踪列表。我的第一个想法是使用你可以看到的阵列,但说实话,我不确定什么是最好的。我可以使用链表吗?我应该使用指针数组吗?我对指针数组和列表等事情的了解总是有些不确定,所以我认为这是学习内容的好机会。
编辑:我应该更清楚:tracklist只是一种方法来存储专辑中很多曲目的标题。
答案 0 :(得分:0)
首先,使用命名空间std会导致细微的错误,正如Max Vollmer在评论中所提到的那样。
我更喜欢设置在构造函数中完成,没有太多理由继续更改Name之类的属性。
这看起来是经典的OOP,你有一个'专辑',它是'曲目'的集合,这些曲目有RecordLabel和Artist?比如说,一个艺术家可以是Emimem,输入'Rapper',类型'Hip Hop';而RecordLabel可以是Vanity,Open等。
所以,让我们说,像这样 -
class RecordLabel
{
LableType m_Type;
public:
RecordLabel():m_Type(LableType::None) {}
RecordLabel(LableType L)
{
m_Type = L;
}
};
class Artist
{
std::string m_Name;
ArtistType m_Type;
ArtistGenre m_Genre;
public:
Artist():m_Type(ArtistType::None), m_Genre(ArtistGenre::None) {}
Artist(const std::string Name, ArtistType Type, ArtistGenre Genre)
{
m_Name = Name; m_Type = Type; m_Genre = Genre;
}
};
class Track
{
std::string m_TrackName;
Artist m_Artist;
RecordLabel m_Lable;
public:
Track(const std::string Name, const Artist& A, const RecordLabel& R)
{
m_TrackName = Name;
m_Artist = A;
m_Lable = R;
}
friend ostream& operator<<(ostream& os, const Track& dt)
{
std::cout<<"TrackName: "<<dt.m_TrackName;
return os;
}
};
class Album
{
std::string m_albumName;
std::vector<Track> m_Tracks;
public: Album(const std::string& Name)
{
m_albumName = Name;
}
void AddTrack(const Track& T)
{
m_Tracks.push_back(T);
}
friend ostream& operator<<(ostream& os, const Album& dt)
{
cout<<"Album Name: "<<dt.m_albumName<<"\n";
for(auto It: dt.m_Tracks)
{
std::cout<<It<<"\n";
} return os;
}
};
工作代码here.