首页 文章

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

提问于
浏览
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 '类型的右值开始,无效初始化'std :: string&{aka std :: basic_string&}'类型的非const引用

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

1 回答

  • 2

    函数 getName 不提供对类的基础 song_name 字段的修改访问 . 无论你做什么,都不能通过 getName (如所写的那样)改变 song_name . 这是让 getName 返回 song_name 字段副本的重点 .

    因此,通过非常量引用接收结果毫无意义 . 无论如何你无法改变它 . 即使你以某种方式做,它也不会对 song_name 产生影响 .

    在这种情况下,你完全不清楚你要做什么

    string& most_popular_song=tmp.getName();    
    most_popular_song = current_song.getName();
    

    序列和所有这些操作的重点是什么 .

    如果您希望能够修改 song_name 字段,则必须从 getName 返回对 song_name 的引用

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

    这将修复您的错误,但这基本上会破坏 getName 函数提供的大部分保护和隔离 . 如果你立即通过一个返回 getName 函数的nopn-const引用将它暴露给外部世界,那么使 song_name 私有的重点是什么?

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

相关问题