1

C++ のデフォルトの動作は常にコピーであることを読みました。したがって、データメンバーの get 関数もデータメンバーのコピーを返すと推測しています。

通常、これは正常に機能しますが、この場合、データメンバーの 1 つがマルチマップです。これは私が今持っているものです:

class Track {
private:
    multimap<long, Note> noteList;
public:

    multimap<long ,Note> getNoteList()
    {
        return noteList;
    }
}

しかし、何らかの理由でこれが機能しません。呼び出しgetNoteList()てもエラーは発生しませんが、コンソールでのプログラムの出力が停止します (アプリの実行中)。私がnoteList公開すれば、すべてうまくいきます。

マルチマップと比較して、int、char、float などの通常の型に違いはありますか? これが機能しない理由は何ですか?どうすれば機能するゲッター関数を書くことができますか?

4

1 に答える 1

2

コンテナーのコピーを返すことは、あまり良い考えではないかもしれません。ほとんどの場合、無駄にコピーしすぎてしまうでしょう。ユーザーが既存のコンテナを変更できないようにする場合は、 を参照して返却する必要がありますconst

class Track {
private:
    multimap<long, Note> noteList;
public:

    multimap<long ,Note> const& getNoteList() const
    {
        return noteList;
    }
}

このクラス呼び出しのクライアントは、コストのかかるコピーを行う必要なく、map に直接getNodeList()アクセスできるようになりました。noteList

クライアントにそのマップを直接変更する機能も提供したい場合は、通常の参照を返すオーバーロードを追加できます。

    multimap<long ,Note>& getNoteList()
    {
        return noteList;
    }

ただし、ここまで来たら、なぜnoteList直接公開しないのかを自問する必要があります。

于 2012-04-22T23:42:25.937 に答える