Как я могу показать на экране список объектов? - PullRequest
0 голосов
/ 12 октября 2019

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

Я использовал функцию list.begin(), чтобы проверить, является ли список правильным и эффективно ли он показывает 1, поэтому я не понимаю, почему значения в цикле for являются неправильными.

Подводя итог, я не нахожу ошибки, поэтому я хотел бы спросить вас, где я ошибся.

Заранее спасибо.

#include <iostream>
#include <list>
using namespace std;

class Algo{

private:
    list <int> l;

public:
    Algo() {l = {1, 2, 3, 4, 5};}
    list <int> getList() {return l;}

};

int main()
{
    Algo a;
    list <int>::iterator it;
    it = (a.getList().begin()); 
    for(it; it != (a.getList().end()); it++)
    {
        cout << *it << "\n";
    }
}

Ожидаемый результат: 1,2, 3,4,5

Реальный выход: 1

-1952806520

16122456

-1228957360

1

-1952806520

16122456

-1228957360

1 (бесконечный цикл)

Ответы [ 3 ]

1 голос
/ 12 октября 2019

list <int> getList() возвращает временную копию инкапсулированного списка. Каждый раз, когда вы вызываете a.getList().end() в цикле, вы получаете итератор другой копии списка, который нельзя сравнить с начальным итератором getList().begin(). Таким образом, цикл бесконечен (итераторы несопоставимы) и вывод является ненужным (временная копия не существует на выходе). Исправьте это, вернув ссылку на инкапсулированный список:

list <int>& getList()
1 голос
/ 12 октября 2019

в функции getlist вы должны возвращать

list <int>& getList() { return l; }

, а не

list <int> getList() { return l; }

, который является копией списка. Из-за того, как вы используете этот список

, когда вызываете его здесь

it=(a.getList().begin());   

, функция get list возвращает копию вашего списка и итератора в свой первый элемент

теперь в цикле for

a.getList().end()

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

, теперь используя "&" в

list <int>& getList() 

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

0 голосов
/ 12 октября 2019

Как отмечали другие, вы возвращаете копию списка.

  1. Избегайте имен, подобных l: они очень запутанные. Используйте что-то вроде _lst.
  2. В зависимости от вашей цели вы можете вернуть:
    • копию - клиент может изменить копию, не изменяя член _lst: list <int> getList()
    • ссылка - избегает копирования, и клиент может напрямую изменить ее: list <int>& getList()
    • или постоянная ссылка - нет копии, и клиент не может изменить ее _lst: const list <int>& getList() const
  3. Если ваше единственное намерение состояло в том, чтобы показать содержимое списка, просто добавьте публичную функцию-член и удалите getList: void dump() const.
  4. Вместо прямогоповторяя до _lst вы можете использовать алгоритм copy для копирования содержимого вашего списка в консоль

    void dump()
    {
      copy(_lst.begin(), _lst.end(), std::ostream_iterator<int>(std::cout, "\n"));
    }
    
  5. Ваш основной становится:

    int main()
    {
      Algo a;
      a.dump();
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...