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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
02.10.2011, 16:41     Метод класса возвращающий итератор #1
Не могу заставить метод класса возвращать итератор, помогите понять почему компилятор не разрешает это сделать:

Класс (методы возвращающие итераторы в самом низу)
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++
Итератор для своего контейнерного класса-списка C++
C++ Как описать метод класса? Как двумя способами описать инлайнируемый метод класса? Что такое this?
Как вынести метод возвращающий шаблонный класс в из hpp в cpp? C++
Метод, возвращающий данные по имеющемуся ключу массива MAP C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
02.10.2011, 18:13  [ТС]     Метод класса возвращающий итератор #21
talis, мой итератор большеват для включния в файл, я писал это чуть ранее.
P.S постфиксный инкремент в итераторе если что не работает, я не разобрался почему, всё остальное протестировал и работает как положено.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
02.10.2011, 18:15     Метод класса возвращающий итератор #22
раскидывать код по разным юнитам трансляции надо тогда, когда это надо, а не когда приспичит преподу с его сомнительными и субъективными критериями о величине или красоте кода
talis
 Аватар для talis
789 / 541 / 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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
02.10.2011, 18:43     Метод класса возвращающий итератор #24
Цитата Сообщение от talis Посмотреть сообщение
Намного красивше стало?
более того - наконец студент стал студентом, список - списком, а итератор - итератором
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.10.2011, 18:45     Метод класса возвращающий итератор #25
alex_x_x, а вам не понравился шаблон в этом посте?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
02.10.2011, 18:48     Метод класса возвращающий итератор #26
talis, это я к первоначальной структурк Students, ListItem, StudentIterator
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
02.10.2011, 22:34     Метод класса возвращающий итератор #28
Цитата Сообщение от Gepar Посмотреть сообщение
Но компилятор ругается (не на то что я пытаюсь переназначить уже определённый конструктор) так что я что-то пишу не так видать.
ошибки вы не написали, но судя по всему у вас параметры по-умолчанию объявлены в двух местах
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
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
 Аватар для talis
789 / 541 / 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
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
02.10.2011, 23:18  [ТС]     Метод класса возвращающий итератор #31
talis, литературу я читать и не переставал, мне до этого не приходилось так хитро всё разбрасывать элементы, хотя здесь я уже понял что нужно было написать
C++
1
Students::ListItem::ListItem
Признаться честно сегодня впервые вообще воспользовался столь длинной конструкцией для объявления конструктора класса, раньше я столь глубоко не пытался ковырять из CPP файла чтобы достать какой-нибудь класс запрятанный в другом.

Добавлено через 2 минуты
Цитата Сообщение от talis Посмотреть сообщение
Да у вас, батенька, конструктор значение возвращает...
Ну а возвращать значение он начал нечаянно и я и не собирался изначально этим конструктором что-либо возвращать, если бы я не знал что конструктор не возвращает значения вряд-ли бы у меня получилось написать какой-либо простенький односвязный список вообще.
talis
 Аватар для talis
789 / 541 / 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     Метод класса возвращающий итератор
Еще ссылки по теме:

C++ Итератор класса vector
Итератор внутри шаблонного класса C++
C++ Как передать в метод класса Menu указатель на метод дочернего класса?

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

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

Текущее время: 02:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru