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

Класс "Студент" - Как записать ссылку на функцию структуры? - C++

Восстановить пароль Регистрация
 
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
01.10.2011, 00:45     Класс "Студент" - Как записать ссылку на функцию структуры? #1
Собственно создаю класс студенты, захотелось мне чего-то впихнуть сюда итератор (свой вариант итератора, если это можно так назвать).

Текущий вопрос:
как записать ссылку на функцию структуры? Нужно это чтобы в моём итераторе была возможность как в stl писать Iterat.first ?
Если точнее то нужно сделать указатель на функцию getFullname()
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
class Students 
{
    friend class StudentsIterator;
    struct ListItem
    {
        //////////////////////////info////////////////////
        string fullname;
        string group;
        int year;
        int average;
        ListItem *Next;
 
        ////////////////////metods///////////////////////////////
 
        ListItem()
        {
            fullname="";
            year=0;
            average=0;
            group="";
            Next=NULL;
        }
 
        ListItem(string &f,int y, int a, string &g)
        {
            setFullname(f);
            setYear(y);
            setAverage(a);
            setGroup(g);
            Next=NULL;
        }
 
 
        void setFullname(string &data)
        {fullname=data;}
 
        string getFullname() // ЭТО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        {return fullname;}
 
        void setYear(int y)
        {
            year=((y>=0 && y<=2012) ? y : -1);
            if (y==-1)
             throw Exception("wrong year");
        }
 
        int getYear()
        {return year;}
 
        void setAverage(int a)
        {
            average=((a>=0 && a<=100) ? a: -1);
            if (average==-1)
             throw Exception("wrong average");
        }
 
        int getAverage()
        {return average;}
 
        void setGroup(string &g)
        {group=g;}
 
        string getGroup()
        {return group;}
 
    };
...
};
? В идеале было бы вообще чтобы если вызывается просто Iterat.first для печати или чтения то вызывалась функция getFullname() из ListItem, а если идёт попытка присвоить значение Iterat.first то вызывалась функция setFullname, хотя вот это вот "в идеале" моё помоему реализовать не удастся я так подозреваю ...

Мой класс итератор, а точнее набросок, если надо:
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
class StudentsIterator
{
    private:
    Students::ListItem* ListPtr;
    public:
 
   const string& first=&ListPtr->getFullname(); // Это не реализовано так как не знаю как написать
 
    StudentsIterator():ListPtr(NULL){}
 
    StudentsIterator(const Students &right)
    {
        *this=right;
    }
 
    StudentsIterator(Students::ListItem* right)
    {
        *this=right;
    }
 
 
    StudentsIterator* operator=(const Students &right)
    {
        ListPtr=right.Current;
        return this;
    }
 
    //для указателей на элемент, например на начало или конец списка
    StudentsIterator* operator=(Students::ListItem* right)
    {
        ListPtr=right;
        return this;
    }
 
    Students::ListItem* where(){return ListPtr;}
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.10.2011, 00:45     Класс "Студент" - Как записать ссылку на функцию структуры? #2
странный код
мне видится, что должно быть так:
- есть класс Student - там все его данные, его методы
- есть List. Логично чтобы он был стандартным шаблоном, но пускай у нас дана хитроумная коллекция, например StudentCollection или StudentList. Класс хранит в себе связанный список студентов и никаких функций для доступа к студентам не представляет
У StudentList есть друг, StudentIterator, который знает о том, как устроен внутри StudentList связанный список - как минимум имеет указатель на текущий элемент и скорее всего на сам StudentList
StudentList имеет функции begin() и end(), которые возвращают итераторы, хранящие указатели на первый и последний (обычно следующий за последним) элементы списка (то бишь студентов)
- StudentIterator умеет возвращать студентов (желательно в виде копий, а не указателей) посредством operator*, или внутренних функций
желательно чтобы и вставка студентов в список проходила тоже через итераторы

а вообще лучше посмотреть на работу итераторов в stl и java и сложить представление что это такое
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
01.10.2011, 00:54  [ТС]     Класс "Студент" - Как записать ссылку на функцию структуры? #3
alex_x_x, я немного переформулировал вопрос.

Добавлено через 2 минуты
alex_x_x, хотя наверное Вы правы, все эти проверки усложняют мой список, возможно и правда их стоит перенести в Students.

Добавлено через 28 секунд
Хотя насчёт итераторов вопрос не пропадает, можно ли реализовать то что я написал насчёт них?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.10.2011, 01:15     Класс "Студент" - Как записать ссылку на функцию структуры? #4
ну сами посудите
в stl это делается так
C++
1
2
3
4
5
6
7
8
9
10
11
std::list<Student*> list;
// добавляем студентов в список
list.push_back(Student("alex"));
list.push_back(Student("pete"));
// создаем итератор указывающий на начало
std::list<Student*>::iterator it = list.begin();
// делаем обход 
++it;
// через функцию итератора получаем указатель на элемент 
// и через указатель вызываем нужные функции
(*it)->getFullName();
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
01.10.2011, 01:49  [ТС]     Класс "Студент" - Как записать ссылку на функцию структуры? #5
alex_x_x, ну мне итераторы нужны на самом деле для печати списка, это основная причина по которой я захотел некое их подобие добавить себе в класс.

Добавлено через 14 минут
При создании класса-итератора возникла проблема, допустим вот мой класс-итератор (всё внимание на ссылку на string first:
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
class StudentsIterator
{
    private:
    Students::ListItem* ListPtr;
    public:
 
    string& first;
 
 
    StudentsIterator():ListPtr(NULL),first(ListPtr->fullname){}
 
    StudentsIterator(const Students &right): first(ListPtr->fullname)
    {
        *this=right;
    }
 
    StudentsIterator(Students::ListItem* right) :first(ListPtr->fullname)
    {
        *this=right;
    }
 
 
    StudentsIterator* operator=(const Students &right)
    {
        ListPtr=right.Current;
        return this;
    }
 
    //для указателей на элемент, например на начало или конец списка
    StudentsIterator* operator=(Students::ListItem* right)
    {
        ListPtr=right;
        return this;
    }
 
    Students::ListItem* where(){return ListPtr;}
};
Как видно она инициализируется адресом на поле ListPtr->fullname, но есть проблема: а что если ListPtr у меня NULL то будет же runtime error, а это не есть хорошо ... как же учесть этот момент?

Добавлено через 1 минуту
Хотя наверное мне стоит просто сделать функции в итераторе типа first() с нормальной проверкой .
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.10.2011, 15:52     Класс "Студент" - Как записать ссылку на функцию структуры? #6
пользователь не должен уметь создавать итераторы, пусть List только умеет их создавать
Yandex
Объявления
01.10.2011, 15:52     Класс "Студент" - Как записать ссылку на функцию структуры?
Ответ Создать тему
Опции темы

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