繁体   English   中英

由引用集/映射迭代器传递的迭代器不可取消引用

[英]iterator passed by reference set/map iterator not dereferencable

我在通过引用传递迭代器时遇到了一些麻烦。 在程序中,我有三个类:A类,其中包含一个std :: map>作为私有成员。 B类将A类作为私人成员持有。 还有在其构造函数中接收到类B的类C。在类C中,我试图检索指向地图的迭代器,如下所示:

class A(){
   private: 
        std::map<std::vector<>> theMap;
   public:
        void theMap_access() {std::string to_access , std::map<std::vector<>>::iterator &it){
        it =  theMap.find(to_access);
        it-> first; //OK
   }         
};

class B(){
   private: 
        A a;
   public: 
        A A_access(){return a;}
};

class C(B &b){
   public: 
       std::map<std::vector<>>::iterator it;
       std::string to_access = "test";
       B.A_access().theMap_access(to_access, it);
       it-> first; //KO
};

当我执行此代码时,我确定“ test”在地图中。 因此,当我在类A中取消引用它时,代码可以正常运行,并且得到它-> first =“ test”。 但是在通过引用将其传递回C类之后,出现了以下错误:set / map迭代器不可取消引用。 我认为迭代器一旦返回就没有指向它在A类中指向的对象。您能否解释一下原因以及如何解决该问题? 非常感谢您的帮助。

我收到此错误:set / map迭代器不可取消。

这是因为在B.A_access返回中使用的A对象:

B.A_access().theMap_access(to_access, it);

执行上述行后不再存在。 因此,您设置的迭代器引用的是不存在的map ,因为该map也已消失。

原因是B.A_access()返回A对象的副本 ,而不是包含您要使用的std::map的实际A对象的副本

如果你想用实际的A包含对象std::map要操作,那么A_access应该返回一个引用A ,而不是复制A

因此,解决方法应该是:

 A& A_access(){return a;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM