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_namegetNamegetNamesong_name

このため、非定数参照によって結果を受け取ることはまったく意味がありません。とにかくそれを変更することはできません。そして、どうにかしても、 には影響しませんsong_name

このような状況では、何をしようとしているのかが完全に明確ではありません

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

シーケンスとこれらすべての操作のポイントは何ですか。

フィールドを変更できるようにしたい場合は、 fromへの参照song_name返す必要がありますsong_namegetName

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

これによりエラーは修正されますが、基本的に、getName関数によって提供される保護と分離のほとんどが無効になります。song_name関数を返す nopn-const 参照を介して外部の世界にすぐに完全に公開する場合、非公開にするポイントは何でしたgetNameか?

への直接参照アクセスを取得しようとする代わりに、setName関数を作成し、それを使用して を変更することをお勧めします。song_namesong_name

于 2013-01-24T01:03:30.567 に答える