Разыменование итератора, указывающего на пользовательский класс - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть набор объектов класса (Fighter), который я перебираю, иногда вызывая функции-члены этого класса. Кажется, что я неправильно разыменую свой итератор, когда пытаюсь вызвать функцию-член объекта, на который указывает итератор.

std::cout << (*iter)->getFrame(text);

Я получаю следующую ошибку компилятора:

ошибка: базовый операнд '->' имеет тип без указателя 'const Fighter'

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Ошибка в том, что ваш контейнер явно не содержит тип указателя в качестве типа элемента. Разыменование итератора дает ссылку на элемент в контейнере, например:

container::value_type &element = *iter;

Если тип элемента не является указателем, а тип не перегружает оператор -> (например, smart как правило, указатели типов), тогда вы не можете использовать оператор -> для доступа к элементам элемента:

element->getFrame(text); // error!

Вместо этого вам нужно использовать оператор .:

element.getFrame(text); // OK!

Поместив его обратно в контекст, вы получите следующее:

std::cout << (*iter).getFrame(text); // OK!

Альтернативой является использование оператора -> на самом итераторе, который разыменовывает итератор для вас, чтобы вы могли получить доступ к элементу. члены в одном выражении:

std::cout << iter->getFrame(text); // OK!
0 голосов
/ 02 апреля 2020

Вы можете просто использовать оператор -> непосредственно на iter. Если вы хотите сначала разыменовать, вы должны использовать оператор .: (*iter).getFrame(text);

std::cout << iter->getFrame(text);

или

std::cout << (*iter).getFrame(text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...