1
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 {aka std::basic_string}”类型的右值对“std::string& {aka std::basic_string&}”类型的非常量引用进行无效初始化

我无法做到,const string& most_popular_song=tmp.getName(); 因为我将其更改为tmp.getName();返回string!我应该怎么做才能摆脱这个错误?

4

1 回答 1

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字段,则必须返回对from的引用song_namegetName

string &mtm::Song::getName() const {    
    return this->song_name;
}

这将修复您的错误,但这基本上会破坏该getName功能提供的大部分保护和隔离。song_name如果您通过 nopn-const 引用返回函数立即将其完全公开给外界,那么私有化有什么意义getName

一个更好的想法是编写一个setName函数并使用它来修改song_name,而不是尝试获得对 . 的直接引用访问song_name

于 2013-01-24T01:03:30.567 回答