Как перебрать список указателей на объект?

У меня есть заявление typedef:

typedef list <Event *> EventList;

который находится сам по себе в моем заголовочном файле (не является частью класса).

У меня есть функция nd_to_el(), в которой я хочу перебрать эту EventList, которая уже заполнена экземплярами Event.

Это то, что я пробовал:

EventList::iterator it;

for (it = this->el.begin(); it != this->el.end(); ++it){
    cout << (*it)->key << endl;
}

(Я также не уверен, правильно ли здесь разыменовывать итератор или нет)

но я получаю эту ошибку:

error: request for member ‘end’ in ‘((CS302_Midi*)this)->CS302_Midi::el’, which is of pointer type ‘EventList*’ {aka ‘std::__cxx11::list<Event*>*’} (maybe you meant to use ‘->’ ?)
for (it = this->el.begin(); it != this->el.end(); ++it)

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

Итератор — это абстракция, предназначенная для работы во многом аналогично указателю, поэтому в некотором смысле it является указателем на указатель, и его необходимо разыменовать, чтобы получить доступ к указателю, на который он ссылается.

user4581301 19.09.2023 00:01

Есть ли причина, по которой ваш list содержит указатели вместо необработанных Event объектов? Для этого могут быть причины, но в большинстве случаев указатели не нужны (особенно, когда вы используете list, а узлы list можно переставлять с семантикой нулевого копирования и перемещения, что дает преимущества указатели еще меньше) и усугубляют ситуацию по нескольким причинам.

ShadowRanger 19.09.2023 00:06

@ShadowRanger Это был заданный заголовочный файл, но я уверен, что в использовании указателей нет особого смысла. Однако существуют и другие функции, написанные на основе этого формата.

Ian Burns 19.09.2023 00:13

«Я хочу пройтись по этому списку событий» — через что EventList? Вы дали определение типа и заявили, что «не является частью класса». Потом вы упомянули функцию, и вдруг появился объект такого типа, и каким-то образом мы теперь находимся в контексте класса (поскольку используется указатель this)? Я думаю, что вы пропустили слишком много шагов в своем объяснении.

JaMiT 19.09.2023 01:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по сообщению об ошибке

{aka ‘std::__cxx11::list<Event*>*’} (возможно, вы имели в виду использовать ‘->’ ?)

кажется, у вас есть указатель на список.

В этом случае цикл может выглядеть так

for (it = this->el->begin(); it != this->el->end(); ++it){
    cout << (*it)->key << endl;
}

Или вы можете использовать цикл for на основе диапазона, например

for ( const auto &e : *this->el )
{
    cout << e->key << endl;
}

И тогда вам следует избавиться от this->, чтобы было немного чище: for (it = el->begin(); it != el->end(); ++it) или for ( const auto &e : *el ).

Remy Lebeau 19.09.2023 01:20

Другие вопросы по теме