无效初始化类型为'std :: string&的非const引用;

时间:2013-01-24 00:58:23

标签: c++ methods reference initialization return

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! 我该怎么做才能摆脱这个错误?

1 个答案:

答案 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的直接参考访问权。