void PlayListTester::testAddSong(){
cout << "- addSong()... " << flush;
PlayList pList("addSongTest.txt");
Song s1("Badge", "Cream", 1969);
Song s2("Godzilla", "Blue Oyster Cult", 1977);
Song s3("Behind Blue Eyes", "The Who", 1971);
pList.addSong(s1);
vector<Song> searchResult = pList.searchByArtist("Cream");
assert( searchResult.size() == 1 );
assert( searchResult[0].getTitle() == "Badge" );
assert( searchResult[0].getYear() == 1969 );
assert( searchResult[0].getArtist() == "Cream" );
cout << " 0 " << flush;
}
Это метод тестирования, который я сделал для добавления объектов Song в вектор PlayList, но моя проблема в том, что он не выдает ошибку, а вместо этого код завершается при первом утверждении. Я просто не понимаю, является ли мой тест ошибочным или это сам мой метод.
vector<Song> PlayList::addSong(const Song& newSong){
vector<Song> v;
v.push_back(newSong);
return v;
Это метод, который я использовал. Это может показаться слишком простым, но теоретически, насколько я понимаю, это должно работать.
PlayList::PlayList(const string& fileName) {
// open a stream to the playlist file
ifstream fin( fileName.c_str() );
assert( fin.is_open() );
// read each song and append it to mySongs
Song s;
string separator;
while (true) {
s.readFrom(fin);
if ( !fin ) { break; }
getline(fin, separator);
mySongs.push_back(s);
}
// close the stream
fin.close();
}
Вот мой конструктор PlayList, если это поможет. Код терпит неудачу в размере утверждают.
Внутри Playlist::addSong()
метод, вы просто делаете векторный объект, который содержит объекты Song, push_back песню к нему. В этот момент этот вектор имеет только один элемент, ту песню, которую вы только что нажали. Вы возвращаете его, но ничего не делаете с ним в методе, из которого вы вызвали функцию, поэтому вектор просто уничтожается, а его память освобождается. Предполагая, что класс Playlist имеет закрытый вектор, который содержит песни, вы должны сделать в этом методе push_back песню в этом векторе. Не то, что вы только что создали там.
Я думаю, что mySongs — это вектор, который вы, в конечном счете, хотите содержать в песне, поэтому он будет выглядеть примерно так:
void PlayList::addSong(const Song& newSong) {
this->mySongs.push_back(newSong);
}
Других решений пока нет …