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

Собственный класс-итератор - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нужна помощь с задачками по циклу for http://www.cyberforum.ru/cpp-beginners/thread359097.html
Здраствуйте все. Уменя вот не получаеться сделать задачки кто сможет мне помочь вот картинки сними http://s57.***********/i156/1110/09/8a38e95f9837t.jpg Первую я сделал а 2 остальные не могу и вот ишо картинки http://s48.***********/i119/1110/cf/447fb0af3208t.jpg http://s55.***********/i147/1110/5e/b6c28c875565t.jpg Помогите пожалуста ибо я с циклами ишо не разобрался до конца
C++ Ошибка C2668: sqrt: неоднозначный вызов перегруженной функции Добрый вечер. Это опять я, чайник. Решаю такую задачу: "Вывести на экран N-ое число из ряда Фибоначчи". Использую формулу Бине Написал код: #include <iostream> #include <conio.h> #include <math.h> using namespace std; void Fibonacci(int); //Прототип функции http://www.cyberforum.ru/cpp-beginners/thread359081.html
C++ В массиве, состоящем из п вещественных элементов, вычислить
помогите написать прогу в С++ В массиве, состоящем из п вещественных элементов, вычислить: - номер минимального по модулю элемента массива (если таких элементов несколько, найти первый); - сумму модулей элементов массива, расположенных после первого отрицательного элемента. Сжать массив, удалив из него все элементы, равные заданному числу Р. Освободившиеся в конце массива элементы заполнить...
"вставка" с "заменой" текста в файле. C++
Здравствуйте. Решил для обретения бесценного опыта написать свой простенький парсер конфигов. Вообщем читает вполне себе читает конфиг.. пишет его... но вот столкнулся с вопросом, который вновинку и ума не приложу как это реализовать. Надо мне сделать так, что если в конфиг пишутся две одинаковые строки, то одна другую "затирает". Как это реализовать? емнип в классе fstream нету что то...
C++ Case http://www.cyberforum.ru/cpp-beginners/thread359061.html
Можно ли как то в конструкции switch case задавать условие например case n<0:и выполнить действие
C++ Поместить в массив с[m] коэффициенты произведения двух многочленов. В массивах a и b хранятся коэффициенты двух многочленов степеней k и l. Поместить в массив с коэффициенты их произведения. (Числа k, l, m - натуральные, m = k + 1; элементы массива с индексом i содержит коэффициенты при x в степени i) подробнее

Показать сообщение отдельно
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517

Собственный класс-итератор - C++

01.10.2011, 20:51. Просмотров 9810. Ответов 6
Метки (Все метки)

Создаю класс-итератор для класса Студенты.
Сам класс студенты:
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
#ifndef STUDENTS_H
#define STUDENTS_H
 
#include <string>
using std::string;
 
#include <iostream>
using std::cout;
using std::cerr;
 
#include <iomanip>
using std::setw;
 
#include <stdexcept>
using std::out_of_range;
 
class Students
{
    friend class StudentsIterator;
    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;
        }
    };
 
    ListItem *Head;
    ListItem *Tail;
    ListItem *Current; //указатель на текущий элемент
    int count; // всего элементов
 
public:
    class Exception
    {
        string str;
        public:
        Exception(string data) :str(data){};
        string what(){return str;}
    };
 
    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();}
 
 
    void addToTail(string data, int y, int a, string g);
    void addToHead(string data, int y, int a, string g);
 
 
    void deleteFromHead(bool mode=1);//1 - с предупреждением(исключением) если список пуст
    void deleteFromTail();
    void deleteAll();
 
    void print();
 
    //for iterators
    ListItem* begin(){return Head;}
    ListItem* end(){return Tail;}
};
Класс-итератор для класса студенты:
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
class StudentsIterator
{
    private:
    Students::ListItem* current;
 
    //функция для проверки что current инициализирован
    void correct(){if(current==0) throw Students::Exception("access denied");}
 
public:
 
    string first(){correct();return current->fullname;}
    string second(){correct();return current->group;}
    int third(){correct();return current->year;}
    int four(){correct();return current->average;}
 
    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;
    }
 
    Students::ListItem* operator++()
    {
        return (current=current->Next);
    }
 
    Students::ListItem* operator++(int)
    {
        Students::ListItem* temp=current;
        ++current;
        return temp;
    }
 
    Students::ListItem* operator*()
    {
        return current;
    }
 
};
 
#endif
Проблема заключается в перегрузке постфиксного оператора инкремента (operator++(int)) - почему-то при вызове из main я получаю вылет, компилятор предупреждений же никаких не выдаёт, но видать что-то же я сделал неправильно, но что именно? Почему я получаю вылет из программы (не моё исключение), может я как-то неправильно возвращаю указатель или ещё чего? Префиксный оператор ++ работает корректно.
Ну и если так есть какие комментарии по поводу улучшения реализации односвязного списка со студентами то тоже пишите.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru