У меня возникли проблемы с передачей итератора по ссылке. В программе у меня есть три класса: класс А, содержащий 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 не может быть разыменован. Я предполагаю, что итератор, прошедший назад, не указывает на то, на что он указывал в классе А. Не могли бы вы объяснить мне, почему и как я могу это исправить? Большое спасибо за вашу помощь.
станд :: Карта <станд :: вектор <>> theMap. Невозможно скомпилировать карту, используя два аргумента шаблона. – user1438832
'B.A_access()' в вашем использовании в классе 'C' возвращает копию объекта' A', и эта копия исчезает до выполнения 'it-> first'. – PaulMcKenzie
Но даже если я исправлю код, чтобы вернуть итератор вроде этого: (в классе 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