我遇到了一些奇怪的问题。我有一个类,它将其值存储在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。
答案 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>