2012-04-22 9 views
1

私は、C++のデフォルトの動作は常にコピーであることを読みました。だから、私はdatamemberのget関数もdatamemberのコピーを返すと思います。マルチマップのためのC++のゲッターとセッター

これは正常に動作しますが、この場合、私のdatamembersの1つはマルチマップです。これは私が今持っているものです:

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

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

しかし、これは動作しません。私がgetNoteList()に電話すると、何のエラーも出ませんが、私のアプリケーションを実行しているときにコンソールのプログラムの出力が止まります。私がnoteListを公開すれば、すべて正常に動作します。

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

答えて

2

コンテナのコピーを返すことは非常に良い考えではありません。ほとんどの場合、何もコピーしないでください。ユーザーが既存のコンテナを変更できないようにするには、constを参照して返す必要があります。

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

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

このクラスのクライアントは、高価なコピーを行う必要がなく、直接noteListマップにアクセスすることができているgetNodeList()を呼び出します。しかし

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

、あなたはこの点に達した場合、あなたはおそらく、なぜ自分自身に問う必要があります。

あなたはまた、クライアントに直接そのマップを変更する機能を与えたい場合は、通常の参照を返し、過負荷を追加することができますnoteListを直接公開することはありません。

+0

アクセサーは、通常、常に良いアイデアです。この場合、noteListはコスト/読み取り専用です。 –

関連する問題