地图参考混乱

时间:2017-06-01 06:51:19

标签: c++ c++11 stl

我遇到了一些奇怪的问题。我有一个类,它将其值存储在map中。但在一种情况下,我需要公开map来进行一些外部计算,并可能在该映射中添加数据。

我有下一个问题。我有该类的shared_ptr并通过引用公开map,但在处理map时不会接受新数据。

我写了一些虚拟的例子,只是为了清楚。这里发生了什么?为什么?

为什么对地图所做的更改在功能结束后不会停止?

#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;
}

编辑:从getMap()方法中删除了const。

1 个答案:

答案 0 :(得分:3)

问题在于:

auto map = m->getMap();

地图类型为std::map<int, int>,因此您可以制作副本并修改此副本。将其更改为:

auto& map = m->getMap();

您将修改传递的地图而不是复制。

顺便说一句。如果您不知道自动变量的类型,您可以随时使用编译器错误来检查:

template<typename T> struct TD;

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

将导致:

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

在这里,您可以阅读map类型为std::map<int, int>