2017-06-01 11 views
-1

私は奇妙な問題で遭遇しました。私は地図の中にその値を格納するクラスを持っています。しかし、あるケースでは、私はマップを公開して、いくつかの外部計算を行い、そのマップ内にデータを追加する必要があります。地図参照混乱

そして次の問題があります。私はそのクラスの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>です:

+1

所有権を共有したくない場合は、shared_ptrをパラメータとして使用しないでください。パラメータがnullでない場合は、未処理のポインタを使用するか、より良い参照を使用してください。 –

答えて

3

問題は、ここでは、ということです。それを変更します。

auto& map = m->getMap(); 

、あなたがコピーするのではなく、渡されたマップを変更します。

btw。で

template<typename T> struct TD; 

auto map = m->getMap(); 
TD<decltype(map)> dd; 

なります:あなたが知らない場合には何を、あなたはいつもこれがチェックするためにコンパイルエラーを使用することができているあなたの自動変数を入力し、あなたがmapタイプを読み取ることができ、ここで

main.cpp:19:21: error: aggregate 'TD<std::map<int, int> > dd' has incomplete type and cannot be defined 
    TD<decltype(map)> dd; 

あるstd::map<int, int>