C ++ std :: list <T> :: iterator Имеет ли итератор доступ к функциям-членам <T>?

0

Это мой первый пост, размещенный здесь в SO, но я использовал ответы и помог здесь некоторое время.

Я сейчас работаю над простой карточной игрой, которую я планировал в течение нескольких лет. В конечном итоге это будет мой старший проект для школы (не прося никого делать домашнее задание для меня!)

Сейчас я испытываю проблему, пытаясь отобразить содержимое списка на консоль через пару классов.

for(std::list<Card>::iterator it = Hand.begin(); it != Hand.end(); it++)
    std::cout<< *it.GetName();

Я пытаюсь выяснить, если линия

std::cout<< *it.GetName();

будет действительным или нет. У меня проблемы с работой, и у меня нет возможности попробовать что-то прямо сейчас. Прежде чем я должен был отказаться от проекта сегодня утром, у меня были некоторые ошибки компиляции, которые заставляли меня поверить, что мне нужно перегрузить оператор <<, который я пробовал, и в результате почему-то получаю пару ссылок на ошибки.

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

Будет ли этот блок печатать имена объектов карты, хранящихся в списке рук, как сейчас? Да, у класса карты есть функция GetName(), и она объявлена правильно.

  • 5
    Я склонен предпочесть it->GetName() . (На самом деле, в C ++ 11 все становится еще лучше: for (Card& card : Hand) { std::cout << card.GetName(); } .)
  • 1
    Если GetName () возвращает строку или int или любой другой тип, который принимает cout, вам не нужно его перегружать.
Показать ещё 2 комментария
Теги:
iterator
stdlist

1 ответ

3
Лучший ответ
*it.getName();

такой же как

*(it.getName());

так как . и вызов функции имеют более высокий приоритет, чем унарный *. Таким образом, компилятор ищет член getName в классе std::list<Card>::iterator, но его нет: getName (я предполагаю) член Card, и итераторы не имеют отношения наследования или пересылки к их объекту.

Вы, вероятно,

(*it).getName();

или, что то же самое,

it->getName();

(Оператор arrow -> является просто сокращением для разыменования, а затем именованием члена.)

  • 0
    Спасибо за ответ. Указатели - это то, что до сих пор доставляет мне немало хлопот, хотя я занимаюсь этим уже несколько лет. Я немного попробовал прочесть их, но большая часть информации в Интернете говорит: «Не используйте их, если нет необходимости»
  • 1
    Я согласен с этим советом, но здесь нет реальных указателей. Хотя большинство вещей, которые вы можете узнать об указателях, также применимы к итераторам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню