Не получается вывести информацию о содержимом вектора класса

Есть класс каталог песен. У него есть вектор музыкальных дисков. У каждого диска есть вектор песен.

    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();
}
→ Ссылка