Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

01.10.2011, 00:45. Просмотров 588. Ответов 5
Метки нет (Все метки)

Собственно создаю класс студенты, захотелось мне чего-то впихнуть сюда итератор (свой вариант итератора, если это можно так назвать).

Текущий вопрос:
как записать ссылку на функцию структуры? Нужно это чтобы в моём итераторе была возможность как в 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;}
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2011, 00:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс "Студент" - Как записать ссылку на функцию структуры? (C++):

Создать класс "Студент" и классы "Бюджетный студент" и "Коммерческий студент" - C++
Доброго времени суток. Помогите с задачкой. Наследование. Создать класс студент и классы бюджетный студент и коммерческий студент.

Структуры "Студент" и "Дата": с чем связана данная ошибка? - C++
С чем связана данная ошибка? //--------------------------------------------------------------------------- /* Составить список группы...

Класс "Студент", реализовать динамический список "Группа студентов" - C++
реализовать динамический список &quot; группа студентов&quot;. Узел: -группа -фамилия Функции списка: -добавление по алфавиту ...

Структуры "Студент" и "Стипендия" - C++
Задание: Используя структурированный тип данных массив структур, составить программу, реализующую обработку массива в соответствии с...

Написать программу с использованием структуры "Студент" - C++
Для получения места в общежитии формируется список студентов, который включает ФИО студента, группу, средний балл, доход...

В массиве структур студент с полями "ИМЯ" "ВОЗРАСТ" "УСПЕВАЕМОСТЬ" выполнить сортировку по успеваемости по возрастанию - C++
в массиве структур студент с полями &quot;ИМЯ&quot; &quot;ВОЗРАСТ&quot; &quot;УСПЕВАЕМОСТЬ&quot; выполнить сортировку по успеваемости по возрастанию. Использовать...

5
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.10.2011, 00:45 #2
странный код
мне видится, что должно быть так:
- есть класс Student - там все его данные, его методы
- есть List. Логично чтобы он был стандартным шаблоном, но пускай у нас дана хитроумная коллекция, например StudentCollection или StudentList. Класс хранит в себе связанный список студентов и никаких функций для доступа к студентам не представляет
У StudentList есть друг, StudentIterator, который знает о том, как устроен внутри StudentList связанный список - как минимум имеет указатель на текущий элемент и скорее всего на сам StudentList
StudentList имеет функции begin() и end(), которые возвращают итераторы, хранящие указатели на первый и последний (обычно следующий за последним) элементы списка (то бишь студентов)
- StudentIterator умеет возвращать студентов (желательно в виде копий, а не указателей) посредством operator*, или внутренних функций
желательно чтобы и вставка студентов в список проходила тоже через итераторы

а вообще лучше посмотреть на работу итераторов в stl и java и сложить представление что это такое
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
01.10.2011, 00:54  [ТС] #3
alex_x_x, я немного переформулировал вопрос.

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

Добавлено через 28 секунд
Хотя насчёт итераторов вопрос не пропадает, можно ли реализовать то что я написал насчёт них?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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();
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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() с нормальной проверкой .
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.10.2011, 15:52 #6
пользователь не должен уметь создавать итераторы, пусть List только умеет их создавать
0
01.10.2011, 15:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2011, 15:52
Привет! Вот еще темы с ответами:

Запись структуры "Студент" в файл - C++
исправьте пожалуйста мои ошибки: 1)Error 1 error C3867: 'std::basic_ofstream&lt;char,std::char_traits&lt;char&gt;&gt;::close': function call missing...

Класс "Студент", найти студентов со средним баллом больше заданного - C++
Вводится база из 7 студентов(Ф И О, средний бал аттестата) – выводится на экран ср. бал больше 4. помогите с решением, все, на что...

Структура/класс "Студент". Применение конструкторов - C++
Не используя функции стандартной библиотеки Си для работы со строками, кроме указанных написать собственную функцию ,реализующую алгоритм....

Создать класс "Студент" и добавить поля - C++
создать класс студент ,имеющий ФИО,дату рождения, контактный телефон, город, страну, название учебного заведения, номер группы. Нужно...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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