const string& mtm::RadioManager::getBestSong() const {
string& most_popular_song=tmp.getName();
most_popular_song = current_song.getName();
return most_popular_song;
}
string mtm::Song::getName() const {
return this->song_name;
}
class Song {
string song_name;
public:
string getName() const;
}
我收到此错误:
'std :: string&类型的非const引用的无效初始化{aka std :: basic_string&}'来自'std :: string {aka'类型的右值 的std :: basic_string的}“
我无法成功const string& most_popular_song=tmp.getName();
因为我将它改为tmp.getName();
返回string
!
我该怎么做才能摆脱这个错误?
答案 0 :(得分:2)
函数getName
不提供对类的基础song_name
字段的修改访问。无论您做什么,都无法将song_name
更改为getName
(如书面所示)。这是让getName
返回song_name
字段的副本的重点。
因此,通过非常量引用接收结果毫无意义。无论如何你无法改变它。即使你以某种方式做,它也不会影响song_name
。
在这种情况下,
完全不清楚你要做什么string& most_popular_song=tmp.getName();
most_popular_song = current_song.getName();
序列以及所有这些操作的重点是什么。
如果您希望能够修改song_name
字段,则必须从song_name
getName
string &mtm::Song::getName() const {
return this->song_name;
}
这将修复您的错误,但这基本上会破坏getName
函数提供的大部分保护和隔离。如果您通过返回song_name
函数的nopn-const引用立即并将其完全暴露给外部世界,那么使getName
变为私有的重点是什么?
更好的想法是编写setName
函数并使用它来修改song_name
,而不是尝试获取song_name
的直接参考访问权。