这是我关于Stackoverflow的第一篇文章,希望我能找到解决问题的方法。
这是班级歌曲的主要内容,它获取元数据(长度,年份,类型)。我认为问题出在函数enumToString,但我不确定:/
Song::Song(Artist artist, string title)
{
an_artist = &artist;
a_title = title;
}
Artist Song::artist() const
{
return *an_artist;
}
void Song::artist(Artist artist)
{
an_artist = &artist;
}
string Song::title() const
{
return a_title;
}
void Song::title(string title)
{
a_title = title;
}
Metadata *Song::metadata()
{
return &a_metadata;
}
// converting enum to string
const string enumToString (Genre val)
{
switch (val)
{
case Genre::Funk:
return "Funk";
case Genre::Soul:
return "Soul";
case Genre::Rap:
return "Rap";
case Genre::Rock:
return "Rock";
case Genre::Unknown:
return "Unknown";
default:
return "Not recognized!";
}
}
string Song::info()
{
int minutes = a_metadata.lengthInSeconds / 60;
int seconds = a_metadata.lengthInSeconds % 60;
cout << "( "<< a_title << " ) " << "by " << an_artist->name()
<< " Genre: " << enumToString(a_metadata.a_genre) << ","
<< " Length: "<< minutes << ":" << seconds << ","
<< " Published: " << a_metadata.publishedInYear;
return "";
}
我正在尝试打印歌曲,但是在第一首之后,出现此错误,并且我真的不知道问题出在哪里。这是我第二次使用C ++编码^^预先感谢您
Moez of fawez
fawez : Moez, Sofiene, Rostom, Amine,
( bara hakeka ) by �>��) Genre: Funk, Length: 15:0, Published: 1980
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
注意:我将答案发布在这里,这样就不必遍历注释才能找到答案。
在artist.cpp的函数“ addSong”中:
void Artist::addSong(Song *song)
{
the_songs.push_back(song);
song->artist(*this); // line I will be referencing
}
您正在传递对象的“ this”指针。每个对象都有其自己的“ this”指针,该指针可访问其自身的内存地址。在此处了解更多信息:https : //www.tutorialspoint.com/cplusplus/cpp_this_pointer.htm
但是在song.cpp的“艺术家”功能中:
void Song::artist(Artist artist)
{
Artist artistou = artist;
}
旁注:在这种情况下,请使用setter和getter(封装)。即无效set_artist(...)和Artist get_artist()。
该参数不能反映您传入了指向对象内存地址的指针。同样,由于artistou是在此函数内部局部声明和定义的,因此一旦程序离开了此函数的范围,此变量的生命就将留在计算机内存中。此变量应在song.h中定义为:
Artist *artistou = new Artist();
然后再从内存中删除[],就不再使用以避免内存泄漏。
总体而言,请查看有关C ++的一些良好编码实践。正如您所说的那样,我将删除一些重要主题的链接,我认为您可以从学习中受益。
继承:https : //en.cppreference.com/book/intro/inheritance
封装和获取和设置器:https : //www.w3schools.com/cpp/cpp_encapsulation.asp
动态内存管理:https://en.cppreference.com/w/cpp/memory
希望对您有所帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句