私は奇妙な問題で遭遇しました。私は地図の中にその値を格納するクラスを持っています。しかし、あるケースでは、私はマップを公開して、いくつかの外部計算を行い、そのマップ内にデータを追加する必要があります。地図参照混乱
そして次の問題があります。私はそのクラスのshared_ptrを持っており、参照によってマップを公開していますが、処理中のマップでは新しいデータを受け入れることはありません。
私はちょうど明確にするために、いくつかのダミーの例を書きました。ここで何が起きてるの?なぜ?
マップの変更が機能終了後に変更されないのはなぜですか?
#include <map>
#include <iostream>
#include <memory>
class MapWrap {
public:
MapWrap() {}
~MapWrap(){}
std::map<int, int>& getMap() { return map; }
private:
std::map<int, int> map;
};
void goGo(std::shared_ptr<MapWrap> m){
auto map = m->getMap();
std::cout << "Func: before: map size: " << map.size() << std::endl;
for(int i = 0; i < 3; ++i){
// This should and will add new value to map.
if(map[i] == 3){
std::cout << "blah" << std::endl;
}
}
std::cout << "Func: after: map size: " << map.size() << std::endl;
}
int main(){
auto mapWrap = std::make_shared<MapWrap>();
for(int i = 0; i < 3; ++i){
goGo(mapWrap);
}
return 0;
}
EDIT:getMap()メソッドからconstを削除しました。マップの
auto map = m->getMap();
タイプので、コピーを作成し、このコピーを修正std::map<int, int>
です:
所有権を共有したくない場合は、shared_ptrをパラメータとして使用しないでください。パラメータがnullでない場合は、未処理のポインタを使用するか、より良い参照を使用してください。 –