2017-01-20 20 views
0

У меня возникли проблемы с передачей итератора по ссылке. В программе у меня есть три класса: класс А, содержащий std :: map> как частный член. Класс B удерживает класс A как частный член. А класс C, который принимает в своем конструкторе класса B. В классе С, я пытаюсь получить итератор, указывающий на карту следующим образом:Итератор передается по ссылке set/map итератор не может быть заменен

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

Когда я выполняю этот код, я уверен, что «тест "находится на карте. Поэтому, когда я разыгрываю его в классе A, код работает нормально, и я получаю его -> first = "test". Но, пройдя его по ссылке обратно в класс C, я получаю эту ошибку: set/map iterator не может быть разыменован. Я предполагаю, что итератор, прошедший назад, не указывает на то, на что он указывал в классе А. Не могли бы вы объяснить мне, почему и как я могу это исправить? Большое спасибо за вашу помощь.

+0

станд :: Карта <станд :: вектор <>> theMap. Невозможно скомпилировать карту, используя два аргумента шаблона. – user1438832

+0

'B.A_access()' в вашем использовании в классе 'C' возвращает копию объекта' A', и эта копия исчезает до выполнения 'it-> first'. – PaulMcKenzie

+0

Но даже если я исправлю код, чтобы вернуть итератор вроде этого: (в классе C) it = B.A_access() .Map_access (to_access); и (в классе A) std :: map > :: итератор theMap_access() {std :: string to_access) {it = theMap.find (to_access); верните его;} Я столкнулся с той же проблемой. Знаете ли вы, как я мог это исправить и указать на карту из класса C. Спасибо. – Eglantine

ответ

0

I get this error: set/map iterator not dereferencable.

Это не потому, что A объект, который используется здесь в возвращении B.A_access:

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

больше не существует после того, как выше линии выполняется. Таким образом, итератор, который вы установили, ссылается на несуществующий map, так как этот map также ушел.

Причина в том, что B.A_access() возвращает копию из A объекта, а не фактическое A объект, который содержит std::map вы пытаетесь использовать.

Если вы хотите использовать фактические A объект, который содержит std::map вы хотите управлять, а затем A_access должен возвращать ссылку на A, а не копия A.

Так что исправление должно быть:

A& A_access(){return a;}