Не получается вывести информацию о содержимом вектора класса
Есть класс каталог песен. У него есть вектор музыкальных дисков. У каждого диска есть вектор песен.
template <class T>
class Base
{
public:
Base(vector<T*> cont) : content(cont) {}
Base(){}
protected:
vector<T*> content;
virtual void add(T* item) = 0; // добавлять треки, диски
virtual void remove(string name) = 0; // удалять треки, диски
virtual void showContent() = 0; // показать список элементов каталога, диска
};
class MusicSong
{
private:
string artist;
string NameOfSong;
int DurationInSeconds;
public:
MusicSong(string a, string nos, int din) : artist(a), NameOfSong(nos), DurationInSeconds(din) {}
string getNameOfSong() { return NameOfSong; }
void setNameOfSong(string nos) { NameOfSong = nos; }
string getArtist() { return artist; }
void setArtist(string art) { artist = art; }
int getDurationInSeconds() { return DurationInSeconds; }
void setDurationInSeconds(int dis) { DurationInSeconds = dis; }
void showContent(){ cout << "Artist: " << artist << '\t' << "Name Of Song: " << NameOfSong << '\t' << "Duration in seconds: " << DurationInSeconds << endl; }
};
class MusicDisk: Base<MusicSong>
{
private:
string nameOfDisk;
vector<MusicSong*> content;
public:
MusicDisk(vector<MusicSong*> s, string nod): Base(s), nameOfDisk(nod) {}
MusicDisk(string name) : nameOfDisk(name) {}
string getName() { return nameOfDisk; }
void add(MusicSong* item) { content.push_back(item); }
void remove(string name)
{
for (vector<MusicSong*>::iterator iter = content.begin(); iter < content.end(); ++iter)
{
if (name == (*iter)->getNameOfSong())
{
content.erase(iter);
break;
}
}
}
void showContent()
{
cout << "Диск: " << nameOfDisk << endl;
for (vector<MusicSong*>::iterator iter = content.begin(); iter < content.end(); ++iter)
{
(*iter)->showContent();
}
}
};
class Catalog: Base<MusicDisk>
{
private:
string nameOfDisk;
public:
Catalog(vector<MusicDisk*> cont, string name) : Base(cont), nameOfDisk(name){}
Catalog(string name): nameOfDisk(name){}
void add(MusicDisk* mda) { content.push_back(mda); }
void remove(string name)
{
for (vector<MusicDisk*>::iterator iter = content.begin(); iter < content.end(); ++iter)
{
if (name == (*iter)->getName())
{
content.erase(iter);
break;
}
}
}
void showContent()// список дисков
{
int i = 1;
for (vector<MusicDisk*>::iterator iter = content.begin(); iter < content.end(); ++iter, ++i)
{
cout <<"Disk №" << i << " \"" << (*iter)->getName() << "\"" << endl;
}
}
void showAll()// список дисков и песен в них
{
int i = 1;
for (vector<MusicDisk*>::iterator iter = content.begin(); iter < content.end(); ++iter, ++i)
{
cout << "Disk №" << i << " \"" << (*iter)->getName() << "\"" << endl;
(*iter)->showContent();
cout << endl;
}
}
};
'''
При вызове функции showAll() класса контент выводится:
Disk no1 "Название диска"
Диск: Название диска
В итоге список песен из диска вывести не получается.
Считывание из файла: Название каталога, Название диска, Количество песен в диске, (Исполнитель, Название, Длительность)*кол-во песен. Каждый пункт с новой строки
ifstream in("input.txt");
ofstream out("output.txt");
setlocale(LC_ALL, "Russian");
string artist, NameOfSong, nameOfCatalog;
int DurationInSeconds;
string NameOfDisk;
int n; //Количество песен на диске
vector <MusicSong*> songs;
vector <MusicDisk*> disks;
getline(in, nameOfCatalog);
while (in.peek() != EOF)
{
getline(in, NameOfDisk);
in >> n;
in.get();
for (int i = 0; i < n; ++i)
{
getline(in, artist);
getline(in, NameOfSong);
in >> DurationInSeconds;
in.get();
MusicSong* song = new MusicSong(artist, NameOfSong, DurationInSeconds);
songs.push_back(song);
}
MusicDisk* disk = new MusicDisk(songs, NameOfDisk);
disks.push_back(disk);
}
Catalog* catalog = new Catalog(disks, nameOfCatalog);
catalog->showAll();
Ответы (1 шт):
Автор решения: Антон
→ Ссылка
Нашел. Проблема в конструкторе класса MusicDisk и в одинаковых названий полей наследуемого и наследующиего класса
using namespace std;
template <class T>
class Base
{
public:
Base(vector<T*> cont) : content(cont) {}
Base(){}
protected:
vector<T*> content;
virtual void add(T* item) = 0; // добавлять треки, диски
virtual void remove(string name) = 0; // удалять треки, диски
virtual void showContent() = 0; // показать список элементов каталога, диска
};
class MusicSong
{
private:
string artist;
string NameOfSong;
int DurationInSeconds;
public:
MusicSong(string a, string nos, int din) : artist(a), NameOfSong(nos), DurationInSeconds(din) {}
string getNameOfSong() { return NameOfSong; }
void setNameOfSong(string nos) { NameOfSong = nos; }
string getArtist() { return artist; }
void setArtist(string art) { artist = art; }
int getDurationInSeconds() { return DurationInSeconds; }
void setDurationInSeconds(int dis) { DurationInSeconds = dis; }
void showContent(){ cout << "Artist: " << artist << '\t' << "Name Of Song: " << NameOfSong << '\t' << "Duration in seconds: " << DurationInSeconds << endl; }
};
class MusicDisk: Base<MusicSong>
{
private:
string nameOfDisk;
vector<MusicSong*> content;
public:
MusicDisk(vector<MusicSong*> s, string nod): Base(s), nameOfDisk(nod) {} // !!! Тут песни сохраняются в переменную класса родителя
MusicDisk(string name) : nameOfDisk(name) {}
string getName() { return nameOfDisk; }
void add(MusicSong* item) { content.push_back(item); }
void remove(string name)
{
for (vector<MusicSong*>::iterator iter = content.begin(); iter < content.end(); ++iter)
{
if (name == (*iter)->getNameOfSong())
{
content.erase(iter);
break;
}
}
}
void showContent()
{
cout << "Диск: " << nameOfDisk << endl;
// ! а тут идет работа с полем content текущего класса
for (vector<MusicSong*>::iterator iter = content.begin(); iter < content.end(); ++iter)
{
(*iter)->showContent();
}
}
};
class Catalog: Base<MusicDisk>
{
private:
string nameOfDisk;
public:
Catalog(vector<MusicDisk*> cont, string name) : Base(cont), nameOfDisk(name){}
Catalog(string name): nameOfDisk(name){}
void add(MusicDisk* mda) { content.push_back(mda); }
void remove(string name)
{
for (vector<MusicDisk*>::iterator iter = content.begin(); iter < content.end(); ++iter)
{
if (name == (*iter)->getName())
{
content.erase(iter);
break;
}
}
}
void showContent()// список дисков
{
int i = 1;
for (vector<MusicDisk*>::iterator iter = content.begin(); iter < content.end(); ++iter, ++i)
{
cout <<"Disk №" << i << " \"" << (*iter)->getName() << "\"" << endl;
}
}
void showAll()// список дисков и песен в них
{
int i = 1;
for (vector<MusicDisk*>::iterator iter = content.begin(); iter < content.end(); ++iter, ++i)
{
cout << "Disk №" << i << " \"" << (*iter)->getName() << "\"" << endl;
(*iter)->showContent();
cout << endl;
}
}
};
int main()
{
ifstream in("input.txt");
ofstream out("output.txt");
setlocale(LC_ALL, "Russian");
string artist, NameOfSong, nameOfCatalog;
int DurationInSeconds;
string NameOfDisk;
int n; //Количество песен на диске
vector <MusicSong*> songs;
vector <MusicDisk*> disks;
getline(in, nameOfCatalog);
while (in.peek() != EOF)
{
getline(in, NameOfDisk);
in >> n;
in.get();
for (int i = 0; i < n; ++i)
{
getline(in, artist);
getline(in, NameOfSong);
in >> DurationInSeconds;
in.get();
MusicSong* song = new MusicSong(artist, NameOfSong, DurationInSeconds);
songs.push_back(song);
}
MusicDisk* disk = new MusicDisk(songs, NameOfDisk);
disks.push_back(disk);
}
Catalog* catalog = new Catalog(disks, nameOfCatalog);
catalog->showAll();
}