Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

Метод класса возвращающий итератор - C++

02.10.2011, 16:41. Просмотров 1992. Ответов 32
Метки нет (Все метки)

Не могу заставить метод класса возвращать итератор, помогите понять почему компилятор не разрешает это сделать:

Класс (методы возвращающие итераторы в самом низу)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Students
{
    friend class StudentsIterator;
    struct ListItem
    {
        string fullname;
        string group;
        int year;
        int average;
        ListItem *Next;
    };
 
    ListItem *Head;
    ListItem *Tail;
    ListItem *Current; //указатель на текущий элемент
    int count; // всего элементов
 
public:
 
    Students(): Head(0), Tail(0), Current(0), count(0) {}
 
    Students(string data, int y, int a, string g)
    {
        Head=Tail=new ListItem(data,y,a,g);
        Current=0;
        count=1;
    }
 
    ~Students(){this->deleteAll();}
 
    //методы для итераторов
    StudentsIterator* begin(){return Head;} //  cannot convert `Students::ListItem*' to `StudentsIterator*' in return
    StudentsIterator* end(){return NULL;} // ВСЁ ОК, КОМПИЛЯТОР НЕ РУГАЕТСЯ
};
Класс-итератор для него ,как видите есть перегруженный конструктор принимающий ListItem*:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class StudentsIterator
{
private:
    Students::ListItem* current;
 
public:
 
    StudentsIterator() {current=0;}
 
    StudentsIterator(const Students &right)
    {
        *this=right;
    }
 
    StudentsIterator(Students::ListItem* right)
    {
        *this=right;
    }
 
 
    StudentsIterator* operator=(Students &right)
    {
        current=right.Current;
        return this;
    }
 
    //для указателей на элемент, например на начало или конец списка
    StudentsIterator operator=(Students::ListItem* right)
    {
        current=right;
        return *this;
    }
 
    StudentsIterator* operator*()
    {
        return this;
    }
 
    operator bool()
    {
        return current!=0;
    }
 
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2011, 16:41     Метод класса возвращающий итератор
Посмотрите здесь:

Шаблон класса двусвязного списка, метод, возвращающий указатель - C++
Пишу шаблон класса двусвязного списка. Всё в хедере. В классе присутствует структура item. Пытаюсь написать метод, возвращающий указатель...

Итератор класса vector - C++
Доброго времени суток. Попалась задача, в которой нужно определить итератор с проверкой выхода за пределы допустимого диапазона для...

Метод, возвращающий данные по имеющемуся ключу массива MAP - C++
Исходный код: #include <string> #include "map.h" class Recipe{ protected: AnsiString name_recipe; //название...

итератор для шаблонного класса - C++
Всем солнца! Честно честно честно пересмотрел более 100 различных вариантов разных решений. НО.... :wall: есть список: ...

Итератор для класса с массивом - C++
Добрый день! Есть небольшая задачка.. необходимо написать класс для готовых комманд код for (Ada::Iterator adaIter =...

Итератор для класса-группы - C++
Доброго времени суток. Нужна помощь. Выполняя лабы по методичке вновь возникла проблема с пониманием логики автора. Необходимо передать в...

Итератор внутри шаблонного класса - C++
пытаюсь создать свой контейнер (на основе std::map) добавлять в него пару данных разных типов, а потом считывать вторую часть пары...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.10.2011, 18:13  [ТС]     Метод класса возвращающий итератор #21
talis, мой итератор большеват для включния в файл, я писал это чуть ранее.
P.S постфиксный инкремент в итераторе если что не работает, я не разобрался почему, всё остальное протестировал и работает как положено.
LosAngeles
Заблокирован
02.10.2011, 18:15     Метод класса возвращающий итератор #22
раскидывать код по разным юнитам трансляции надо тогда, когда это надо, а не когда приспичит преподу с его сомнительными и субъективными критериями о величине или красоте кода
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.10.2011, 18:29     Метод класса возвращающий итератор #23
В разных файлах, говорите? Вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**********************
   main.cpp
***********************/
 
#include <iostream>
#include "list.h"
 
using namespace std;
 
int main()
{
    StudentsList lst;
 
    lst.push_front( Student("Anderson") );
    lst.push_front( Student("Parker") );
    lst.push_back( Student("Denton") );
    lst.push_back( Student("Jenson") );
 
    for( StudentsList::iterator it = lst.begin(); it != lst.end(); it++ )
       cout << (*it).name << ' ';
 
    cout << '\n';
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**********************
   list.h
***********************/
 
#ifndef LIST_H
#define LIST_H
 
#include <string>
 
class Student
{
public:
    std::string name;
 
    /* что угодно... */
 
    Student( const std::string &_name ) : name( _name ) {};
    Student( const Student &st ) : name( st.name ) {};
};
 
class StudentsList
{
    class item
    {
    public:
        Student value;
        item * next;
        item * prev;
 
        item( Student v ) : value ( v ), next(0), prev(0) {};
    };
 
    item * head,
         * tail;
 
public:
    class iterator
    {
        item * p;
 
    public:
        iterator( item * _p ) : p(_p){};
        iterator( const iterator &it ) : p( it.p ){};
 
        Student & operator*();
 
        iterator operator++(int);
        iterator operator--(int);
 
        bool operator==( const iterator &it );
        bool operator!=( const iterator &it );
 
        iterator & operator=( const iterator& it );
    };
 
    StudentsList();
    ~StudentsList();
 
    void push_back( const Student &v );
    void push_front( const Student &v );
 
    iterator begin();
    iterator end();
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**********************
   list.cpp
***********************/
 
#include "list.h"
 
StudentsList::StudentsList()
{
    head = new item( Student("") );
    tail = head;
};
 
StudentsList::~StudentsList()
{
    while( head )
    {
        item * old = head;
        head = head->next;
        delete old;
    }
}
 
void StudentsList::push_back( const Student &v )
{
    tail->value = v;
    tail->next = new item( Student("") );
    tail->next->prev = tail;
    tail = tail->next;
}
 
void StudentsList::push_front( const Student &v )
{
    item * itm = new item( v );
    itm->next = head;
    head->prev = itm;
    head = itm;
}
 
StudentsList::iterator StudentsList::begin()
{
    return iterator( head );
}
 
StudentsList::iterator StudentsList::end()
{
    return iterator( tail );
}
 
// ------------ итератор ----------------------------
 
Student & StudentsList::iterator::operator*()
{
    return p->value;
}
 
StudentsList::iterator StudentsList::iterator::operator++(int)
{
    if(p) p = p->next;
    return *this;
}
 
StudentsList::iterator StudentsList::iterator::operator--(int)
{
    if(p) p = p->prev;
    return *this;
}
 
bool StudentsList::iterator::operator==( const StudentsList::iterator &it )
{
    return p == it.p;
}
 
bool StudentsList::iterator::operator!=( const StudentsList::iterator &it )
{
    return p != it.p;
}
 
StudentsList::iterator & StudentsList::iterator::operator=( const StudentsList::iterator& it )
{
    p = it.p;
    return *this;
}
Намного красивше стало?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
02.10.2011, 18:43     Метод класса возвращающий итератор #24
Цитата Сообщение от talis Посмотреть сообщение
Намного красивше стало?
более того - наконец студент стал студентом, список - списком, а итератор - итератором
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.10.2011, 18:45     Метод класса возвращающий итератор #25
alex_x_x, а вам не понравился шаблон в этом посте?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
02.10.2011, 18:48     Метод класса возвращающий итератор #26
talis, это я к первоначальной структурк Students, ListItem, StudentIterator
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.10.2011, 22:26  [ТС]     Метод класса возвращающий итератор #27
talis, боюсь не всё так просто, у меня есть ещё класс исключений в полной версии что в виде прикреплённого файла, и что-то мне подсказывает что не увидит его мой класс-итератор если вот так просто перенести определение его в другой файл.

Добавлено через 7 минут
talis, какой-то у вас странный постфиксный инкремент
C++
1
2
3
4
        iterator operator++(int){
            if(p) p = p->next;
            return *this;
        };
Добавлено через 24 минуты
И ещё маленький вопрос, как конструктор для ListItem
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Students
{
        struct ListItem
        {
                string fullname;
                string group;
                int year;
                int average;
                ListItem *Next;
 
         ListItem(string name="",int y=0,int aver=0,string gr="",ListItem* next=0)
    {
              fullname=name;
             group=gr;
            average=(aver>=0 && aver<=100 ? aver : -1);
            year=(y>=1950 && y<=2012 ? y : -1);
 
            if(average==-1 || year==-1)
             throw Exception("wrong data");
            Next=next;
             }
        };
вынести в cpp файл?
Пишу в нём
C++
1
Student::ListItem Student::ListItem (string name="",int y=0,int aver=0,string gr="",ListItem* next=0)
Но компилятор ругается (не на то что я пытаюсь переназначить уже определённый конструктор) так что я что-то пишу не так видать.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
02.10.2011, 22:34     Метод класса возвращающий итератор #28
Цитата Сообщение от Gepar Посмотреть сообщение
Но компилятор ругается (не на то что я пытаюсь переназначить уже определённый конструктор) так что я что-то пишу не так видать.
ошибки вы не написали, но судя по всему у вас параметры по-умолчанию объявлены в двух местах
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.10.2011, 22:44  [ТС]     Метод класса возвращающий итератор #29
alex_x_x, убрал параметры по умолчанию в .cpp файле, но компилятор по прежнему пишет
Код
students.cpp|3|error: no 'Students::ListItem Students::ListItem(std::string, int, int, std::string, Students::ListItem*)' member function declared in class 'Students'|
Что странно, так как какраз в классе студент объявлен класс ListItem с такими параметрами ...
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.10.2011, 22:48     Метод класса возвращающий итератор #30
Цитата Сообщение от Gepar Посмотреть сообщение
Students::ListItem Students::ListItem(std::string, int...
Да у вас, батенька, конструктор значение возвращает... И вообще, не struct, а class.

Добавлено через 1 минуту
Gepar, не обижайтесь пожалуйста, но вы делаете настолько "детские" ошибки... Начните с литературы. Проще переучиться заново, чем исправлять уже имеющееся.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.10.2011, 23:18  [ТС]     Метод класса возвращающий итератор #31
talis, литературу я читать и не переставал, мне до этого не приходилось так хитро всё разбрасывать элементы, хотя здесь я уже понял что нужно было написать
C++
1
Students::ListItem::ListItem
Признаться честно сегодня впервые вообще воспользовался столь длинной конструкцией для объявления конструктора класса, раньше я столь глубоко не пытался ковырять из CPP файла чтобы достать какой-нибудь класс запрятанный в другом.

Добавлено через 2 минуты
Цитата Сообщение от talis Посмотреть сообщение
Да у вас, батенька, конструктор значение возвращает...
Ну а возвращать значение он начал нечаянно и я и не собирался изначально этим конструктором что-либо возвращать, если бы я не знал что конструктор не возвращает значения вряд-ли бы у меня получилось написать какой-либо простенький односвязный список вообще.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.10.2011, 23:21     Метод класса возвращающий итератор #32
Gepar, положите класс итератора в открытую часть класса списка, а класс узла списка (который с указателями на следующий и предыдущий узлы) - в закрытую часть класса. реализуйте их методы где хотите, главное включите заголовочник с определением, и пишите полный "путь" до метода:

C++
1
2
3
4
CList::iterator & CList::iterator::operator=( CList::iterator &other )
{
  // вроде этого
}
Добавлено через 2 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
если бы я не знал что конструктор не возвращает значения вряд-ли бы у меня получилось написать какой-либо простенький односвязный список вообще.
Не понял логики высказывания... Конструкторы не возвращают значений, как и деструкторы, и выглядят так:

C++
1
2
3
4
5
6
// конструктор итератора
CList::iterator::iterator( /* параметры */ )
: /*список инициализации*/
{
  /* тело */
}
В списке инициализаторов указываются конструкторы родительских классов и конструкторы полей класса (если нужно), с параметрами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2011, 23:33     Метод класса возвращающий итератор
Еще ссылки по теме:

Как вынести метод возвращающий шаблонный класс в из hpp в cpp? - C++
Есть код в заголовоном файле: template&lt;class T,typename Ptr&gt; class LINQ { private: Ptr begin; Ptr end; std::vector&lt;T*&gt;...

Как на плюсах будет выглядеть метод, возвращающий bool myArr[][]? - C++
Подскажите пожалуйста, как на плюсах будет выглядеть метод, написанный на c#: static bool Test(bool area) { ...

Итератор контейнера внутреннего класса шаблона - C++
Следующий код компилируется: struct A { struct B {}; vector&lt;B&gt; vec; vector&lt;B&gt;::iterator it; }; А следующий код не...

Как правильно должен быть написан метод возвращающий ссылку на вектор - C++
Доброе время форумчане! Ну собственно сама тема говорит Есть класс class SoftwareCore { private: public:

Итератор для своего контейнерного класса-списка - C++
Здравствуйте. Есть класс List, и мне надо помимо стандартных методов приделать к нему итератор. #include &lt;cstdlib&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.10.2011, 23:33  [ТС]     Метод класса возвращающий итератор #33
talis, вот именно не поняли, я написал в cpp файле вначале
C++
1
Students::ListItem Students::ListItem
не потому что хотел чтобы конструктор у меня начала возвращать значение, а потому что не знал достоверно как добраться к конструктору ListItem класса Students из cpp файла.
Кстати буду благодарен если оставите комментарии по поводу полной версии класса Студенты (я создал тему так как название этой не соответствует слегка)
Yandex
Объявления
02.10.2011, 23:33     Метод класса возвращающий итератор
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru